u-boot硬件驱动——以SD卡为例
u-boot硬件驱动
一、硬件驱动
目前,我把硬件驱动理解成介于操作系统和硬件之间的层级。主要作用是屏蔽硬件层,并且方便操作系统管理硬件。
以SD卡为例:
与SD初始化相关的文件uboot中有三个。分别为./drivers/mmc/mmc.c
,./drivers/mmc/s3c_hsmmc.c
与./cpu/s5pc11x/setup_hsmmc.c
。
其中mmc.c
与s3c_hsmmc.c
共同构成了驱动层。
二、函数分析
应做事项
在start_armboot
函数中,对mmc进行了初始化。
mmc的初始化分为三部分:
重要结构体分析
mmc
该结构体其实类似于class。将data与method分开处理。method采用的方法是函数指针。
struct mmc {
struct list_head link;
char name[32];
void *priv;
uint voltages;
uint version;
uint f_min;
uint f_max;
int high_capacity;
uint bus_width;
uint clock;
uint card_caps;
uint host_caps;
uint ocr;
uint scr[2];
uint csd[4];
uint cid[4];
ushort rca;
uint tran_speed;
uint read_bl_len;
uint write_bl_len;
u32 capacity;
struct mmc_ext_csd ext_csd; /* mmc v4 extended card specific */
block_dev_desc_t block_dev;
int (*send_cmd)(struct mmc *mmc,
struct mmc_cmd *cmd, struct mmc_data *data);
void (*set_ios)(struct mmc *mmc);
int (*init)(struct mmc *mmc);
};
mmc_devices
这是一个全局变量,是一个指针,指向mmc设备的链表。
cpu_mmc_init
该函数位于./cpu/s5pc11x/cpu.c
中,属于CPU初始化。主要做三件事,初始化SoC时钟,设置gpio,向mmc_devices
中注册SD卡。
find_device
从mmc中寻找设备,然后得到该设备的信息。
mmc_init
主要执行以下步骤:
上述函数全部在./drivers/mmc/mmc.c
。
这些函数利用的是mmc_send_cmd
函数。该函数利用了存储在MMC设备结构体的函数指针,send_cmd
。这些操作的底层函数全部在./drivers/mmc/s3c_hsmmc.c
中定义。
由此可见驱动中的分层。mmc.c
与s3c_hsmmc.c
的功能完全不同。mmc.c
是完全可移植的,但是s3c_hsmmc.c
就不可移植。