当前位置: 首页 > >

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结构体来链接的。


欢迎各位指出不足之处


?????



友情链接: