天天看點

Linux驅動之挂在SD卡

      講解之前我得說一下,現在有一個新的技術在公司已經在用了,遠遠比你在學校學的東西要先進一點,我們燒寫u-boot程式一般是在flash上,然後由flash中的程式來引導linux核心,但是flash成本遠遠比sd卡要高,現在公司很多都用sd卡來代替flash,這個具體怎麼實作,還得自己去學習,我目前也不是很熟悉這個新的技術,就不寫出來了,等我熟悉以後再寫出來分享吧。

linux中對s3c2440 sd驅動已經支援的非常好。為了讓fl2440支援2g以上的sd卡,隻需要完成幾個步驟即可。

linux2.6.30.9核心源碼中s3c2440 cpu的sd卡控制器驅動對應的源碼檔案為 s3cmci.c 存放在\drivers\mmc\host目錄下。 sd驅動的源碼在平台裝置驅動架構,移植步驟如下:

這裡我得強調一下這個核心版本更新是很快的,是以些地方有可能是不一樣的,但是思路是不變得。

1.     在核心中注冊sd卡平台裝置。通過修改mach-smdk2440.c 檔案來實作。在mach-smdk2440.c檔案的smdk2440_devices數組中增加s3c_device_sdi 平台裝置成員,如下所示:

static struct platform_device *smdk2440_devices[] __initdata = {

    &s3c_device_usb,

    &s3c_device_lcd,

    ......

   &lys3c2440_device_st16c554,

    &s3c_device_sdi,  //增加sd卡平台裝置結構體,也就是硬體部分相關的代碼,如果你學過platform總線架構,這裡就非常好了解了。

};

s3c_device_sdi平台裝置定義在devs.c檔案中,如下所示:/* 這裡已經定義好了,就不需要我們在去定義了 */

struct platform_device s3c_device_sdi = {

       .name              = "s3c2410-sdi",

       .id            = -1,

       .num_resources      = array_size(s3c_sdi_resource),

       .resource         = s3c_sdi_resource,

 /* 第二部很重要了,這裡就得去分析你的sd卡函數接口,如果你用的核心預設的接口就不用修改了,一般也是預設的接口,隻有極個别的開發闆是用的其他接口,這個可以參考晶片手冊 */

 2.     修改s3cmci.c, 設定檢測sd卡插入的中斷号,及配置響應的引腳為中斷功能。如下所示:修改s3cmci_probe函數,将

    host->irq_cd = s3c2410_gpio_getirq(host->pdata->gpio_detect);

修改為:

    host->irq_cd = irq_eint18;

    s3c2410_gpio_cfgpin(s3c2410_gpg10,s3c2410_gpg10_eint18);

設定檢測sd插入的中斷号為外部中斷18,這時是根據fl2440的原理圖來确定的。fl2440 sd卡接口的原理圖如下所示:

Linux驅動之挂在SD卡

ncd pin腳是用于檢測sd卡插入的引腳,由圖可以看出 ncd接的是 eint18 号外部中斷。

3.     添加mmc核心配置選項

在核心的mmc配置選項中添加對s3c sd/mmc的支援,如下圖所示:

Linux驅動之挂在SD卡

4.     在核心中取消所有分區類型

取消核心中的所有分區,如下所示:

Linux驅動之挂在SD卡

進行以上修改後,重新編譯zimage ,這樣這個zimage就支援 sd卡驅動了。

 /* zimage很少使用了,一般都用u image,這裡還是可以實作動态加載驅動,不編譯進核心,這就根據自己的項目來确定了,為了節省成本,獲得高效率,沒用到的程式堅決不編譯進核心*/

 /* 新核心版本已經不需要了 */

5.     建立 sd卡分區裝置檔案節點,如下所示:

mknod  /dev/mmcblk0p1 b 179 1      /* 手動建立裝置節點,也可以在程式寫給類,利用mdev機制自動建立裝置節點 */

6. 挂載檔案系統,指令如下:

mount  /dev/mmcblk0p1 /mnt

這樣我們就可以使用sd卡了。

繼續閱讀