块设备部分现在还没有涉及,先来分析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,只有这一个才会引发真正的读写操作,进而导致设备硬件中断。