在系统初始化过程中始能终端串口输出

因为要移植kgdb, 需要串口在系统初始化的过程中就能使用,而以前的代码串口终端打印要到串口驱动初始化完成后才能生效.所以决定把在init/main.c里start_kernel的console_init给用起来,这样kgdb也可以用,调试串口驱动前的代码也可以用.

下面是一些要点:
1. console_init会执行放在*(.con_initcall.init)段里的代码,而console_initcall(xxx_serial_console_init)会在
编译的时候把xxx_serial_console_init放在*(.con_initcall.init),所以初始化串口的代码要放在xxx_serial_console_init 函数里。
2. 由于console_init会在vm初始化前执行,所以在整个串口初始化的过程中不能调用任何vm 相关的函数,比如vmalloc,ioremap等,另外也不能调用任何和clock相关的函数,比如clk_get, clk_enable等。
3. 另外在初始化过程中要用到串口platform device的信息,但这个时侯platform bus还没有初始化,所以我们只能通过指针共享的方式传递platform device 的信息。
4. 这段代码的调试可能有点困难,最好实现把LED驱动或自己写个串口输出函数。

下面就以atmel里的代码为例说明哪些是要实现的(Linux 2.6.28)

1.linux/drivers/serial/atmel_serial.c 的__init atmel_console_init(void)函数,里面的atmel_default_console_device是
由platform device传递过来的, 哪个是default console 是在板子做map io的时候传递进来的。这个时候map io已经完成,但init_machine, init_irq还没有做。struct atmel_uart_port atmel_ports结构经行初始化,初始化的内容是从platform_device atmel_default_console_device里得到的。
2.代码执行的流程为:register_console --> atmel_console_setup --> atmel_set_termios

你可能感兴趣的:(在系统初始化过程中始能终端串口输出)