sd卡读文件过程分析(二)(内核2.6.29,驱动goldfish)

 

 

块设备部分现在还没有涉及,先来分析goldfish驱动吧。

goldfish驱动MMC设备的代码在driver/mmc/下,一共有三个层次:host,core,card。

card层:对应具体的设备驱动,如MMC/SD卡块设备驱动,SDIO UART

core层:为上次设备驱动实现提供操作接口,和下层host注册提供机制

host层:具体MMC/SD/SDIO控制器驱动层。如S3C2440 MMC/SD控制器驱动

这里主要分析host层。对应的文件是driver/mmc/host/goldfish.c

一. 模块初始化。

goldfish_mmc_probe会在系统初始化时被调用。probe函数构造mmc_host数据结构并通过调用mmc_add_host将设备加入到系统中。在构造mmc_host结构的过程中要注意2个地方,一个是 request_irq(host->irq, goldfish_mmc_irq, 0, DRIVER_NAME, host);这里绑定中断处理函数(goldfish_mmc_irq)和代表设备的数据结构(goldfish_mmc_host)。

另一个处是:

        GOLDFISH_MMC_WRITE(host, MMC_SET_BUFFER, host->phys_base);

这行语句进行I/O操作,往MMC设备的一个寄存器里面写数据,指名了buffer的地址(DMA模式)。

二. 构造请求

用户通过文件系统来访问MMC设备,在块设备驱动中会形成request放到请求队列中。所有的请求由驱动程序统一调度。这一部分的代码估计在card层,我没有详细分析。

三. 请求处理

最终,驱动会调用goldfish_mmc_request来处理请求。request函数先把host里面的mrq指针指向请求数据结构,再依次调用goldfish_mmc_prepare_data和goldfish_mmc_start_command

goldfish_mmc_prepare_data做一些设备寄存器设置和数据拷贝工作。

goldfish_mmc_start_command则发送设备操作命令:GOLDFISH_MMC_WRITE(host, MMC_CMD, cmdreg);

整个goldfish里面有很多的GOLDFISH_MMC_WRITE,只有这一个才会引发真正的读写操作,进而导致设备硬件中断。

往MMC_CMD寄存器发送了命令之后,设备操作完成之后会发送中断,系统捕获中断之后会执行中断处理程序goldfish_mmc_irq。
四. 中断处理
goldfish_mmc_irq先读取设备状态,然后根据设备状态进行下一步操作,部分代码如下:
        if (cmd_timeout) {
                struct mmc_request *mrq = host->mrq;
                mrq->cmd->error = -ETIMEDOUT;
                host->mrq = NULL;
                mmc_request_done(host->mmc, mrq);
        }
        if (end_command) {
                goldfish_mmc_cmd_done(host, host->cmd);
        }
        if (transfer_error)
                goldfish_mmc_xfer_done(host, host->data);
        else if (end_transfer) {
                host->dma_done = 1;
                goldfish_mmc_end_of_data(host, host->data);
        }
        if (state_changed) {
                u32 state = GOLDFISH_MMC_READ(host, MMC_STATE);
                pr_info("%s: Card detect now %d/n", __func__,
                        (state & MMC_STATE_INSERTED));
                mmc_detect_change(host->mmc, 0);
        }
命令正常完成的情况下,end_command和end_transfer是true,其他是false。
这时先执行goldfish_mmc_cmd_done给mmc_command结构的一些成员赋值,并处理下一个请求(如果存在)。
然后执行goldfish_mmc_end_of_data将数据从DMA中拷贝到相应的位置。
至此,MMC的一次硬件操作就完成了。
另外,mmc_data有个scatterlist指针,保存了转换之后的地址。虚拟化的时候很恶心。。。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值