MTKSD驱动

上传人:xy****7 文档编号:45535653 上传时间:2018-06-17 格式:DOCX 页数:6 大小:37.31KB
返回 下载 相关 举报
MTKSD驱动_第1页
第1页 / 共6页
MTKSD驱动_第2页
第2页 / 共6页
MTKSD驱动_第3页
第3页 / 共6页
MTKSD驱动_第4页
第4页 / 共6页
MTKSD驱动_第5页
第5页 / 共6页
点击查看更多>>
资源描述

《MTKSD驱动》由会员分享,可在线阅读,更多相关《MTKSD驱动(6页珍藏版)》请在金锄头文库上搜索。

1、首次出关于 MTK 方面的驱动文章,网上也很少有这方面的文章,所以我立志要写几篇这样的文章来引导刚出道的朋友们,咱们一起努力!大家都说 MTK 简单,但我个人做过高通平台一年时间,然后转而做 MTK 平台,感觉还是能学到东西的,代码并不比所谓的高通简单,只是它做的好,封装的好,所以做这块驱动可能开发者做的事情没高通多,所以大家觉得容易,学不到东西。但只要自己对技术执着,深入到架构的实现,还是能学到很多的。我要让大家有这样一个思想,我们做 MTK 平台的不比做其他任何平台的差。一. SD 卡的基本知识:SD 卡有 9 个 pin 脚(micro-SD 为 8 个,少一个接地 pin 脚),如图所

2、示,SD 的数据传输方式有两种,普通 SD 模式和 SPI 模式,以 SD 模式为例,9 个 pin 脚分别是VDD,VSS,CLK,以及我们需要关注的一根指令线 CMD,4 根数据线 DAT0DAT3。 分类:按存储大小,普通 SD 卡(2GB,dev.platform_data; /这个函数相当于hw =mt6573_sd0_hw 红色字体的变量是等价的reg = platform_get_resource(pdev, IORESOURCE_MEM, 0); /申请驱动的内存dma = platform_get_resource(pdev, IORESOURCE_DMA, 0); /申请驱

3、动的 DMA 空间irq = platform_get_irq(pdev, 0); /中断申请cirq = platform_get_irq(pdev, 1); /插卡外部中断申请mmc-ops = /SD 卡的处理函数,这个也是重点,等下再进入分析mmc-f_min = HOST_MIN_SCLK;mmc-f_max = HOST_MAX_SCLK; /SD 卡的工作时钟.tasklet_init(tasklet_init(tasklet_init(这三个函数是中断处理下半部分别是处理识别卡/卡传输数据的 buffer/卡传输数据的 DMA 通道。mt6573_sd_init_hw(host

4、, dma); /具体 SD 卡的硬件寄存器参数的设置if (hw-flags else mt65xx_irq_set_sens(cirq, MT65xx_EDGE_SENSITIVE);ret = request_irq(unsigned int)cirq, (irq_handler_t)mt6573_sd_cd_irq, 0, DRV_NAME, host);if (ret)goto free_irq;这一段是热插拔识别 SD 卡的重要函数,做热插拔这里必须实现。platform_set_drvdata(pdev, mmc); /把 mmc 的数据挂到 pdev 私有数据下ret = mm

5、c_add_host(mmc); /把 mmc 加载到主控制器队列里面去ret = misc_register( /建立 SD 卡的另外 ops 的设置,等下也做分析static struct miscdevice msdc_em_dev = .minor = MISC_DYNAMIC_MINOR,.name = “mt6573-sd0“,.fops = 即分别实现了 ioctl 和 open。刚说要分析 mt6573_sd_ops,点进去看,static struct mmc_host_ops mt6573_sd_ops = .request = mt6573_sd_request, /SD

6、 卡实现通信的请求,这个函数很重要,等下再分析.set_ios = mt6573_sd_set_ios, /SD 卡的时钟,电压,数据通道等设置 .get_ro = mt6573_sd_card_readonly, /实现 SD 卡的只读形式.get_cd = mt6573_sd_card_inserted, /实现 SD 卡插入函数.enable_sdio_irq = mt6573_sd_enable_sdio_irq, /SD 卡中断的使能;即分别实现了上述各函数。重点来看看函数:static void mt6573_sd_request(struct mmc_host *mmc, str

7、uct mmc_request *mrq)struct mt6573_sd_host *host = mmc_priv(mmc); /host 为 mmc 的私有值if (!is_card_present(host) | host-power_mode = MMC_POWER_OFF) . /判断又没 SD 卡插入以及 SD 电源开了没if (host-id =0) | (host-id = 1) MSG(OPS, “Enable SD host/card working ability!n“);clr_device_working_ability(clock_idhost-id, SLOW_

8、IDLE_STATE);clr_device_working_ability(clock_idhost-id, DEEP_IDLE_STATE); /设置 host 时钟,card 的时钟保持工作状态msdc_set_bksz(data-blksz); /设置 SD 卡的 block 数据大小msdc_clr_fifo(); /传输之前先清空 fifo 缓冲区的数据if (dma) /判断用 DMA 方式还是 FIFO 方式来传输数据msdc_dma_on();msdc_fifo_irq_off(); else msdc_dma_off();msdc_fifo_irq_on();if (mt6

9、573_sd_send_command(host, cmd, polling, CMD_TIMEOUT) != 0)这个函数是向 SD 卡发送指令,进入这个函数是一系列 SD 卡的指令分类处理,具体参照SD 的手册看这部分代码,我个人就没怎么仔细研究啦。if (cmd-opcode = SD_IO_RW_EXTENDED) if (cmd-arg memset(abort.opcode = SD_IO_RW_DIRECT;abort.arg = 0x80000000; /* write */abort.arg |= 0 blksz % 4) /* The delay is required a

10、nd tunable. The delay time must* be not too small. Currently, it is tuned to 25us.(CHECKME)*/udelay(25);msdc_reset();这一段主要是读写的函数了,是否工作在 cmd53 模式下。这样整个 request 函数分析完了,整体感觉就是先设置 SD 参数,然后向 SD 发指令,等待 SD 应答。应答后以何种方式来传送数据,数据是怎样传送滴。等等。从上面的分析可以看出 SD 卡虽然代码庞大,但只要仔细理清头绪,一切都可以迎刃而解。祝大家都能突破自我,攻破技术。后续我如果有更深入的分析会补充上来滴。谢谢!

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 行业资料 > 其它行业文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号