u-boot硬件驱动——以SD卡为例

u-boot硬件驱动——以SD卡为例

u-boot硬件驱动

一、硬件驱动

  目前,我把硬件驱动理解成介于操作系统和硬件之间的层级。主要作用是屏蔽硬件层,并且方便操作系统管理硬件。
  以SD卡为例:
  与SD初始化相关的文件uboot中有三个。分别为./drivers/mmc/mmc.c,./drivers/mmc/s3c_hsmmc.c./cpu/s5pc11x/setup_hsmmc.c
  其中mmc.cs3c_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.cs3c_hsmmc.c的功能完全不同。mmc.c是完全可移植的,但是s3c_hsmmc.c就不可移植。

原文地址:https://www.cnblogs.com/0nism/p/12380577.html