今天下午闲下来了,想想还是给EVB增加一下SD/MMC的驱动吧。SD/MMC的官方文档很少,也没有啥书写到这个问题,听说华清远见的宋宝华老师的新一版《Linux驱动开发》会讲这个问题。不过Linux最大的优点就是开源,大家都可以研究,网上也有人写了2410、2440的相关分析文章了,大家都有转载,比如以下网址的一篇:
http://blog.chinaunix.net/u3/106866/showart_2203940.html
基本的大家都分析了,我分析的估计还没人清楚,毕竟那也是要花时间的,我就说说这里面的一个小的部分吧,就是scatterlist.使用scatterlist的原因就是系统在运行的时候内存会产生很多碎片,比如4k,100k的,1M的,有时候对应磁盘碎片,总之就是碎片。而在网络和磁盘操作中很多时候需要传送大块的数据,尤其是使用DMA的时候,因为DMA操作的物理地址必须是连续的。假设要1M内存,此时可以分配一个整的1M内存,也可以把10个10K的和9个100K的组成一块1M的内存,当然这19个块可能是不连续的,也可能其中某些或全部是连续的,总之情况不定,为了描述这种情况,就引入了scatterlist,其实看成一个关于内存块构成的链表就OK了。
在SD/MMC代码中,在发起request的时候,都是通过scatterlist来发送数据的,定义在mmc_data里面,(MMC core就是这么设计的,跟具体的S3C2410还是PXA就没有关系了)