uboot之uboot中的硬件驱动

一、uboot和linux驱动

    1、uboot本身是裸机程序,裸机程序是没有驱动概念的

    2、裸机程序是直接操控硬件的,操作系统中必须通过驱动来操控硬件。这两个的区别在于分层。

    3、uboot的虚拟地址对硬件操作的影响

        (1)、操作系统(linux)下MMU肯定是开启的,也就是说linux驱动中肯定都使用的是虚拟地址。而纯裸机中根

        本不会开MMU,全部使用的是物理地址。这是裸机下和驱动中操控硬件的一个重要区别。

        (2)、uboot早期也是纯物理地址工作的,但是现在的uboot开启了MMU做了虚拟地址映射,这个东西驱动也必

        须考虑。查uboot中的虚拟地址映射表,发现除了0x30000000-0xfffffff映射到了0xc000000-0xcffffff之外,其余的

        虚拟地址空间全是原样映射的。而我们驱动中主要是操控硬件寄存器,而S5PV210的SFR都在0xExxxxxx地址空间,

        因此驱动中不必考虑虚拟地址。

    4、uboot借用了linux驱动

        (1)、linux驱动本身做了模块化设计。linux驱动本身和linux内核不是强耦合的,这是linux驱动可以被uboot借用

        的关键。

        (2)、uboot移植了linux驱动源代码。uboot是从源代码级别去移植linux驱动的,这就是linux系统的开源性。

    5、mmc_initialize

        (1)、函数位于:uboot/drivers/mmc/mmc.c。用于初始化开发板上的MMC系统。

    6、cup_mmc_init

        (1)、函数位于:uboot/cpu/s5pc11x/cpu.c中。用于初始化SoC里的MMc控制器初始化。

    7、smdk_s3c_hsmmc_init

        (1)、函数位于:uboot/drivers/mmc/s3c_hsmmc.c中。函数内部通过宏定义USE_MMCx来决定是

        否调用s3c_hsmmc_initialize来进行具体的初始化操作。

    8、s3c_hsmmc_initialize

        (1)、函数位于:uboot/drivers/mmc/s3c_hsmmc.c中。定义并且实例化一个struct mmc类型的对象

        (定义了一个指针,并且给指针指向有意义的内存,或者说给指针分配内存),然后填充它的各种成员,

         最后调用mmc_register函数来向驱动框架注册这个mmc设备驱动。

    9、find_mmc_device

        (1)、这个函数位于:uboot/drivers/mmc/mmc.c中。进行mmc卡的初始化。

2.10.3.3、总结

(1)至此整个MMC系统初始化结束。

(2)整个MMC系统初始化分为2大部分:SoC这一端的MMC控制器的初始化,SD卡这一端卡本身的初始化。前一步主

要是在cpu_mmc_init函数中完成,后一部分主要是在mmc_init函数中完成。

(3)整个初始化完成后去使用sd卡/iNand时,操作方法和mmc_init函数中初始化SD卡的操作一样的方式。读写sd卡时

也是通过总线向SD卡发送命令、读取/写入数据来完成的。

(4)顺着操作追下去,到了mmc_send_cmd函数处就断了,真正的向SD卡发送命令的硬件操作的函数找不到。这就是学

习驱动的麻烦之处。

(5)struct mmc结构体是关键。两部分初始化之间用mmc结构体来链接的,初始化完了后对mmc卡的常规读写操作也是

通过mmc结构体来链接的。

欢迎各位指出不足之处

     

猜你喜欢

转载自blog.csdn.net/qq_41003024/article/details/80456560