一、uboot与linux驱动
1、uboot是裸机程序
- 狭义的驱动的概念:操作系统中用来具体操控硬件的那部分代码叫驱动。
- 裸机中没有驱动的概念,因为没有操作系统。
- 裸机程序是直接操控硬件的,而操作系统中则是通过驱动来操控硬件。两者的本质区别是分层。
2、uboot的虚拟地址对硬件操作的影响
(1)操作系统下,MMU是开启的,即linux驱动使用的都是虚拟地址。纯裸机程序不会开启MMU,全部使用物理地址。
- 这是裸机下和驱动中操控硬件的一个重要区别。
(2)uboot早期也是纯物理地址工作,但是现在的uboot开启了MMU做了虚拟地址映射。
- 查uboot中的虚拟地址映射表,发现除了0x30000000-0x3FFFFFFF映射到了0xC0000000-0xCFFFFFFF之外,其余的虚拟地址空间全是原样映射的。
- 我们驱动中主要是操控硬件寄存器,而S5PV210的SFR都在0xExxxxxx地址空间,因此驱动中不必考虑虚拟地址。
3、uboot移植了linux驱动
(1)linux的驱动是模块化设计。
- linux驱动本身和linux内核不是强耦合的,这是linux驱动可以被uboot移植的关键。
(2)uboot移植了linux驱动源代码。
- uboot是从源代码级别去移植linux驱动的,这就是linux系统的开源性。
(3)uboot中的硬件驱动比linux简单。
- linux驱动本身有更复杂的框架,需要实现更多的附带功能,而uboot本质上只是个裸机程序,uboot移植linux驱动时只是借用了linux驱动的一部分而已。
二、iNand/SD驱动解析
1、MMC驱动的初始化,是在start_armboot函数中,调用的是mmc_initialize函数
下面看一下mmc_initialize函数
(1)函数位于uboot/drivers/mmc/mmc.c。
(2)此函数主要是初始化开发板上MMC系统。
- SoC里的MMC控制器初始化(MMC系统时