zoukankan      html  css  js  c++  java
  • 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就不可移植。

  • 相关阅读:
    Linux之网络ping(unknown host)故障及yum no more mirrors to try
    vim 中与编码有关的选项
    linux系统时间设定
    linux查看物理cpu的核数,个数,逻辑cpu的个数
    简单的api实现以及动态函数调用
    python2.7 urllib和urllib2
    四级菜单实现二
    四级菜单实现一
    url请求特殊字符转换
    tomcat配置
  • 原文地址:https://www.cnblogs.com/0nism/p/12380577.html
Copyright © 2011-2022 走看看