SD卡驱动移植 Linux系统移植第2版 教学课件-PPT课件_第1页
SD卡驱动移植 Linux系统移植第2版 教学课件-PPT课件_第2页
SD卡驱动移植 Linux系统移植第2版 教学课件-PPT课件_第3页
SD卡驱动移植 Linux系统移植第2版 教学课件-PPT课件_第4页
SD卡驱动移植 Linux系统移植第2版 教学课件-PPT课件_第5页
已阅读5页,还剩31页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、第第1111章章 SD SD卡驱动移植卡驱动移植 Linux Linux系统移植第系统移植第2 2版版 教学课件教学课件11.1.3 SD功能描述主机与卡之间的通信都是由主机控制的,主机发送的命令有两种类型,分别为播送命令和地址点对点命令。播送命令地址点对点命令卡识别模式数据传输模式1.操作状态的验证2.卡的初始化和识别处理3.数据传输模式11.2 SD卡驱动程序分析11.2.1 host驱动局部11.2.2 core驱动局部11.2.3 card驱动局部11.2.1 host驱动局部host驱动局部是针对不同类型主机的驱动,支持的开发板包括atmel、S3C等。这里就以S3C系统为例介绍ho

2、st局部的主要内容。1.驱动的注册函数2.驱动注销函数3.接口函数4.探针函数接口函数6.传递结构体为mmc_request类型的请求1.驱动的注册函数驱动的注册函数s3cmci_init(),用于注册平台设备驱动。static int _init s3cmci_init(void)return platform_driver_register(&s3cmci_driver);/注册平台设备驱动2.驱动注销函数驱动注销函数s3cmci_exit(),用于注销平台设备驱动。static void _exit s3cmci_exit(void)platform_driver_unregister(

3、&s3cmci_driver);/注销平台设备驱动3.接口函数平台设备接口函数包括probe、remove、shutdown、suspend、resume。其结构如下:static struct platform_driver s3cmci_driver = .driver= .name= s3c-sdi, .owner = THIS_MODULE, .pm= s3cmci_pm_ops,.id_table= s3cmci_driver_ids,.probe= s3cmci_probe,.remove= _devexit_p(s3cmci_remove),.shutdown= s3cmci_s

4、hutdown,;4.探针函数探针函数s3cmci_probe(),用于分配s3cmci_host结构体,然后对该结构体进行设置。对结构体mmc_host进行设置,将结构体mmc添加到主机。接口函数mmc子系统的接口函数包括request、set_ios、get_ro、get_cds。其结构如下:static struct mmc_host_ops s3cmci_ops = .request= s3cmci_request,/实现命令和数据的发送.set_ios= s3cmci_set_ios, /根据核心层传来的ios来设置硬件IO.get_ro= s3cmci_get_ro, /从GPIO

5、口读取,判断卡是否写保护.get_cd= s3cmci_card_present, /从GPIO口读取,判断卡是否存在.enable_sdio_irq = s3cmci_enable_sdio_irq,/允许STDIO中断请求;6.传递结构体为mmc_request类型的请求函数s3cmci_request()用于CORE局部发送mrq请求。static void s3cmci_request(struct mmc_host *mmc, struct mmc_request *mrq)struct s3cmci_host *host = mmc_priv(mmc);host-status =

6、mmc request;host-cmd_is_stop = 0;host-mrq = mrq;/*如果卡准备就绪,那么通过s3cmci_send_request ()发送请求,将mrq赋给host-mrq,如果卡没有准备就绪,那么调用mmc_request_done ()终止请求*/if (s3cmci_card_present(mmc) = 0) dbg(host, dbg_err, %s: no medium presentn, _func_);host-mrq-cmd-error = -ENOMEDIUM;mmc_request_done(mmc, mrq); else/*函数s3cm

7、ci_send_request ()首先判断是否为发送数据命令,如果为发送数据那么通过函数s3cmci_send_request ()建立数据,然后判断是否为dma方式,如果为dma方式那么通过dma方式发送数据,否那么采用fifo方式发送数据。如果为命令那么通过函数s3cmci_send_command()发送命令*/s3cmci_send_request(mmc); core驱动局部core驱动局部完成不同协议和标准的实现,包括设置在节中介绍的有关SD卡相关的状态或修改状态、修改存放器等操作。1.用于卡的探测和初始化函数mmc_sd_init_card()2.删除SD卡函数mmc_sd_r

8、emove()3.初始化主机结构体函数mmc_alloc_host()4.初始化主机硬件函数mmc_add_host()5.删除host硬件函数mmc_remove_host()6.释放主机结构体函数mmc_free_host()1.用于卡的探测和初始化函数mmc_sd_init_card()在重启时,函数mmc_sd_init_card()参数oldcard中包含准备初始化的卡,该函数检测卡的有效性,并对该卡初始化。2.删除SD卡函数mmc_sd_remove()函数mmc_sd_remove()用于移除主机host,释放当前卡。static void mmc_sd_remove(struc

9、t mmc_host *host)BUG_ON(!host);BUG_ON(!host-card);mmc_remove_card(host-card);host-card = NULL;3.初始化主机结构体函数mmc_alloc_host()函数mmc_alloc_host()在host层探针函数中被调用,该函数为主机结构体分配空间,并初始化主机结构体。4.初始化主机硬件函数mmc_add_host()函数mmc_add_host()用于增加设备类,并启动 mmc_add_host(struct mmc_host *host)int err;WARN_ON(host-caps

10、 & MMC_CAP_SDIO_IRQ) &!host-ops-enable_sdio_irq);led_trigger_register_simple(dev_name(&host-class_dev), &host-led);err = device_add(&host-class_dev);if (err)return err;#ifdef CONFIG_DEBUG_FSmmc_add_host_debugfs(host);#endifmmc_start_host(host);return 0;5.删除host硬件函数mmc_remove_host()函数mmc_remove_host(

11、)与函数mmc_add_host()相对应,用于停止函数mmc_add_host()启动的host,删除设备类,注销LED trigger。void mmc_remove_host(struct mmc_host *host)mmc_stop_host(host);#ifdef CONFIG_DEBUG_FSmmc_remove_host_debugfs(host);#endifdevice_del(&host-class_dev);led_trigger_unregister_simple(host-led);6.释放主机结构体函数mmc_free_host()函数mmc_free_host

12、()与函数mmc_alloc_host()对应,释放函数mmc_alloc_host()初始化的host结构体。void mmc_free_host(struct mmc_host *host)spin_lock(&mmc_host_lock);idr_remove(&mmc_host_idr, host-index);spin_unlock(&mmc_host_lock);put_device(&host-class_dev);11.2.3 card驱动局部SD卡属于块设备,card驱动局部为了将SD卡驱动成为块设备。介绍该局部的内容时先介绍驱动结构体和接口函数结构体,然后介绍几个关键的驱动

13、函数。1.驱动的结构体mmc_driver2.块设备操作结构体mmc_bdops3.块设备探针函数mmc_blk_probe()4.驱动的入口函数mmc_blk_init()5.为块设备分配空间函数mmc_blk_alloc()1.驱动的结构体mmc_driver该结构体定义驱动的名字,驱动探针函数、驱动移除函数、驱动阻塞和驱动重启等 函数。static struct mmc_driver mmc_driver = .drv= .name = mmcblk,.probe= mmc_blk_probe,.remove= mmc_blk_remove,.suspend= mmc_blk_suspe

14、nd,.resume= mmc_blk_resume,;2.块设备操作结构体mmc_bdops结构体mmc_bdops中定义了块设备操作的接口函数。static const struct block_device_operations mmc_bdops = .open= mmc_blk_open,.release= mmc_blk_release,.getgeo= mmc_blk_getgeo,.owner= THIS_MODULE,;3.块设备探针函数mmc_blk_probe()该函数主要完成检验卡支持的命令,分配mmc_blk_data结构体空间,设置块的大小,最后设置card的dri

15、ver_data 字段,并注册mmc信息到系统。4.驱动的入口函数mmc_blk_init()加载驱动时该函数被调用,该函数向内核申请注册一个块设备,然后进入核心层进行注册。static int _init mmc_blk_init(void)int res;/*向内核申请注册一个块设备*/res = register_blkdev(MMC_BLOCK_MAJOR, mmc);if (res)goto out;/*进入核心层进行注册*/res = mmc_register_driver(&mmc_driver);if (res)goto out2;return 0; out2:unregist

16、er_blkdev(MMC_BLOCK_MAJOR, mmc); out:return res;5.为块设备分配空间函数mmc_blk_alloc()函数mmc_blk_alloc()为块设备分配空间,并初始化一个请求队列,设置设备队列的sector大小。11.3 SD卡移植步骤11.3.1 添加延时和中断11.3.2 配置内核11.3.3 烧写新内核11.3.1 添加延时和中断文件可以参考进行修改,这里不对该文件的修改进行介绍,可以下载到开发板公司修改好的压缩文件。另外,延时和中断也在附带的代码中添加,添加延时在文件中。1.添加延时2.添加中断设置1.添加延时修改文件,在底层函数pio_tasklet()中添加延时。#include static void pio_tasklet(unsigned long data)struct s3cmci_host *host = (struct s3cmci_host *) data;disable_irq(host-irq);udelay(50);2.添

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论