最近迷上了一支名叫Bon Jovi美国乐队,很喜欢其中的一首歌《Bed of Roses》。理想中的生活就应该是听听歌,谈谈爱,梦想着被laid down in a bed of roses,可惜实际的生活却是被U-Boot像冰山一样的代码彻底撩倒。调试U-Boot和Linux内核,成就感总是来得极其不容易。

s_init()是一个比较关键的函数,它完成启动时的很多功能,包括时钟设置、串口设置等等。它会调用preloader_console_init()函数,此时串口信息才开始打印。之后会调用set_mux_conf_regs()函数,将GPIO口设置为相应的外设功能,此处根据自己的电路板作相应的修改。

如果要在U-Boot中新增加一个GPIO口,那么需要以下几个步骤:
1.定义struct module_pin_mux结构体,以GPIO3_8为例:
static struct module_pin_mux gpio3_8_pin_mux[] = {
        {OFFSET(emu1), (MODE(7))},
        {-1},
};

其中emu1定义在struct pad_signals中,对应着GPIO的首个外设功能,在技术手册的Pin Assignments中可以找到,GPIO的外设功能通常不止一种,所以MODE代表外设功能的编号。“-1”作为结束的判断标记。

2.执行函数:
configure_module_pin_mux(gpio3_8_pin_mux);
这个函数就放置在set_mux_conf_regs()中,和其i2c0、nand、spi0等等同时设置。

3.执行函数:
gpio_request(104, "led");
这个函数的作用是申请GPIO,检查它是否可用,如果可用则返回0,否则返回-1;
由于AM335x有128个GPIO口,而GPIO3_8是它的第104个(32*3+8);
“led”没有实际的用途,也可以空置;

4.执行函数:
gpio_direction_output(104, 0);
将GPIO设为输出,且置低。

5.执行函数:
gpio_set_value(104, 0);
gpio_set_value(104, 1);

==============================================
这些我都是放在set_mux_conf_regs()中执行的,
void set_mux_conf_regs(void)
{
    printf("maria: -> set_mux_conf_regs()\n");
    enable_board_pin_mux();

    int i;
    if (gpio_request(104, "led") == 0) {
        gpio_direction_output(104, 0);
        while (1) {
            gpio_set_value(104, 0);
            for (i = 0; i < 100; i++)
                printf("maria: AAA delay 100 times.\n");

            gpio_set_value(104, 1);
            for (i = 0; i < 100; i++)
                printf("maria: BBB delay 100 times.\n");

        }
    }
}
至此就能观察到串口不停的循环打印信息,核心板上面的LED灯一闪一闪的了。