real6410开发板Uboot中添加控制LED驱动

为了熟悉一下uboot,所以想在uboot中实现一下LED的驱动,现记录一下。
先看看uboot的大概执行流程,real6410板子配套的源代码好像跟原始的Uboot不一样,暂时按其配套的来做:
uboot中最先执行的是start.s,位于\cpu\s3c64xx路径下,通过调用函数start_armboot();跳转到board.c中执行,board.c位于\lib_arm中,接下来会调用cpu_init();board_init();dram_init();main_loop();等函数来初始化开发板中

的硬件资源,最后uboot中的各下载选项菜单就位于main_loop();函数中。这几个函数所在文件的路径分别如下:
cpu_init()  --\cpu\s3c64xx\cpu.c
board_init()
dram_init()   -- \board\samsung\smdk6410\smdk6410.c
main_loop   --\common\main.c
整个执行流程如下图:
            start.s
                 |
                 |start_armboor();
           board.c
--------------------------------------
|                    |cpu_init();   |board_init();
|main_loop();   |          |dram_init();
    main.c        cpu.c     smdk6410.c
我只是粗率的看了一下代码,如有错误还请指正。

最终调用驱动的操作,基本上都在main.c中执行,接下来添加的LED驱动就是在这里执行。
接下来进入正题,添加LED的驱动。
    基本上添加一个驱动都会在配置一个配置文件中体现,这个配置文件为:smdk6410.h位于\include\configs中,在里面添加一个CONFIG_LED_ENABLE的宏,然后在main.c中就可以用这个宏来控制是否要加LED的驱动,还可以在led.c中用这个宏来控制整个.c文件中代码是否有效等。\include\configs\smdk6410.h这个文件中还有很多针对开发板的一些配置,比如IP,serverIP等默认设置,相当于WinCE中的配置文件。

    接下来在\drivers目录下新建两个文件(led.c和led.h),然后在里面添加相应的代码。这里有两点需要注意:
1.和WinCE中的BOOT不一样,UBOOT中就已经使用了MMU,所以里面所用的地址是经过映射后的地址。
2.uboot中要遵循读-修改-写的规则,每次写寄存器之前都要先读一次,这跟在WINCE系统中是不一样的。
有一个错误记录一下:代码中少了一个对应的括号,会导致“error: unterminated argument list invoking macro “ledwrite”!”这样的错误。

6410的寄存器定义全部放在\include\s3c6410.h中里面好像都是经过MMU映射之后的地址了,\include\路径下还有一个regs.h文件,好像跟上面的s3c6410.h是一样的,所以我包含头文件的时候是包含的regs.h。


led.c驱动中,操作寄存器的函数是直接调用uboot中的标准函数,需要加上io.h文件,里面定义了寄存器操作函数,文件所在路径是\include\asm-arm\io.h。在使用写寄存器函数时要注意确定那个参数是寄存器,哪个参数才是要给寄存器赋的值。

增加完驱动之后,你要让编译器知道你增加了这个驱动,所以要修改drivers路径下的makefile文件,添加led.o一项即可。

最后在main.c中使用时,要用相对路径,添加led.h文件才能正常使用led.c中导出的函数。

你可能感兴趣的:(linux学习)