使用带有ARM cpu的uart

使用带有ARM cpu的uart,c,arm,uart,C,Arm,Uart,我想为ARM编写一个裸机hello world。消息应该在uart上输出。设备树文件说明了uart: uart@09000 { compatible = "arm,pl011", "arm,primecell"; reg = <0x9000 0x1000>; interrupts = <0x5>; }; 我使用arm js是因为它是唯一一个足够完整(mmu,可

我想为ARM编写一个裸机hello world。消息应该在uart上输出。设备树文件说明了uart:

            uart@09000 {
            compatible = "arm,pl011", "arm,primecell";
            reg = <0x9000 0x1000>;
            interrupts = <0x5>;
        };
我使用arm js是因为它是唯一一个足够完整(mmu,可以运行linux)并且非常简单的arm仿真器(没有jit或者类似的东西)

另外,是否有一种方法可以集成uart驱动程序,该驱动程序在构建时读取设备树文件的信息?是否有一个内核允许我独立使用该部分

/编辑

cpu是ARMv5 cortex-a9 vexpress处理器。我不确定还有哪些信息值得关注,因此

而且

你不能只说ARM cpu,请具体说明与工具链和开发板/平台一起使用的确切微控制器。制造商使用我希望现在添加所有缺失的细节。此外,你可以查看处理器数据表。地址可以是
0x90001000
;由于PowerPC的传统,设备树可能是大端的,但我相信UART的物理地址的数据表。>cpu是ARMv5 cortex-a9 vexpress处理器,我认为cortex-a9是ARMv7a处理器(在大多数情况下也是MP Core)。此外,如果我们是纯金属的,是否必须首先初始化UART?(激活时钟、设置波特率、数据大小、流量控制等…)还是由处理器的ROM代码完成?(我不知道vexpress)
// vexpress.js:651
const int    DR    = 0x00;
const int    FR    = 0x18;
const int    IBRD  = 0x24;
const int    FBRD  = 0x28;
const int    LCR_H = 0x2c;
const int    CR    = 0x30;
const int    IFLS  = 0x34;
const int    IMSC  = 0x38;
const int    MIS   = 0x40;
const int    ICR   = 0x44;
unsigned int *uart;

void
putc(char c)
{
    // wait for UART to become ready to transmit
    // vexpress.js:707
    while ((uart[FR] & (1 << 7)));
    uart[DR]= c;
    while ((uart[FR] & (1 << 7)));
}

void
puts(char *s) {    
    while(*s)
        putc(*(s++));    
}

int
main()
{
    char s[] = { 'H', 'a', 'l', 'l', 'o' , 0};
    int i;
    // vexpress.js:1455
    uart = (unsigned int*)0x10009000;


    // 1
    putc('H');
    putc('a');
    putc('l');
    putc('l');
    putc('o');
    putc(' ');
    putc('W');
    putc('e');
    putc('l');
    putc('t');
    putc('\n');
    putc('\r');

    // 2
    puts(s);

    // 3
    for(i=97;i<123;i++){
        putc((char)i);
    }

    // 4
    puts("Hello World\n\r");
    while(1);
}
Hallo Welt                                                                      
a\0\0\0\0.........                                                               
uart = (unsigned int*)0x10009000;

while ((uart[FR] & (1 << 7)));
const int FR = 6;
unsigned int volatile *uart;