日本免费全黄少妇一区二区三区-高清无码一区二区三区四区-欧美中文字幕日韩在线观看-国产福利诱惑在线网站-国产中文字幕一区在线-亚洲欧美精品日韩一区-久久国产精品国产精品国产-国产精久久久久久一区二区三区-欧美亚洲国产精品久久久久

實(shí)用技巧:Linux2.6.18 SD卡驅(qū)動(dòng)的修正

;platform: s3c2440linux 2.6.18 在linux2.6.18 中,sd卡的驅(qū)動(dòng)有不少的bug.例如,沒有寫保護(hù)的功能. 在驅(qū)動(dòng)的模塊中預(yù)留了寫保護(hù)的函數(shù),但是沒有實(shí)現(xiàn),代碼也只有幾行,只要加上去編譯一下就OK了. static struct mmc_host_ops s3c2410sdi_ops = {.request = s3c2410sdi_request,.set_ios = s3c2410sdi_set_ios,.get_ro = s3c2440_get_ro, //sd card ReadOnly Flag.};實(shí)現(xiàn)函數(shù)如下: static int s3c2440_get_ro(struct mmc_host *mmc){struct s3c2410sdi_host *host = mmc_priv(mmc);unsigned long flags;int present;spin_lock_irqsave(&host->complete_lock, flags);present = read_gpio_bit(S3C2410_GPB0); present &= 0x01;spin_unlock_irqrestore(&host->complete_lock, flags);return present;}還有一些就是熱插拔的和中斷檢測口,只要設(shè)置一下就可以用了. 比較麻煩的是對SD卡寫操作,只要寫稍微大點(diǎn)的文件到SD卡就會(huì)出錯(cuò),打印出如下信息: [IRQ] csta=00000a19 dsta=00000002 fsta=00002200 dcnt=00008000[IRQ] csta=00000a19 dsta=00000002 fsta=00002200 dcnt=00007000[IRQ] csta=00000a19 dsta=00000002 fsta=00002200 dcnt=00007000[IRQ] csta=00000a19 dsta=00000002 fsta=00002200 dcnt=00007000對比正常傳送打印出來的信息,很明顯程序是在這里掛掉了. 后來跟蹤代碼發(fā)現(xiàn),當(dāng)寫一個(gè) 4096(512*8)的數(shù)據(jù)時(shí),只寫了第一個(gè)512byte就不往下寫了,所以dcnt一直為 7000,出現(xiàn)這個(gè)現(xiàn)象的原因是因?yàn)槌绦驅(qū)?host->pio_words 這個(gè)變量賦的值為128,通過 host->pio_words-- 遞減到0時(shí)就不進(jìn)入 while(sdi_fsta & S3C2410_SDIFSTA_TFDET && host->pio_words)這個(gè)循環(huán)了, 所以 host->pio_words=sdi_bsize>>2; 這一行應(yīng)改為 host->pio_words = mrq->data->blocks * (sdi_bsize>>2); 這樣對SD卡的寫操作就解決了.但寫的速度不是很快. 還有一個(gè)問題,比如 cp 一個(gè)文件到SD卡上,是不是首先先將這個(gè)文件寫到SDRAM上,然后umount的時(shí)候再將SDRAM中的內(nèi)容真正寫SD卡上??我umount的時(shí)候會(huì)過多一會(huì)才出現(xiàn)終端的提示符,根據(jù)寫入文件的大小確定 umount的時(shí)間? 后來查了一下資料,Linux文件系統(tǒng)更新是一個(gè)復(fù)雜的過程,當(dāng)用戶程序?qū)ξ募到y(tǒng)進(jìn)行修改以后,例如進(jìn)行了寫操作,文件數(shù)據(jù)把修改記錄在內(nèi)核緩沖中,在數(shù)據(jù)沒有寫到磁盤的時(shí)候,依然能夠執(zhí)行用戶進(jìn)程,所有數(shù)據(jù)的改變都在inode的內(nèi)容中得到反映 。磁盤的數(shù)據(jù)更新實(shí)際上是異步進(jìn)行的,很有可能在寫操作已經(jīng)完成很長時(shí)間以后才真正對磁盤的數(shù)據(jù)進(jìn)行更新 。sync命令強(qiáng)制把磁盤緩沖的所有數(shù)據(jù)寫入磁盤,如果在沒有把磁盤緩沖區(qū)的信息寫入磁盤之前終止系統(tǒng),則磁盤的文件系統(tǒng)就會(huì)處在一個(gè)不穩(wěn)定的狀態(tài) 。而在正常模式下即使沒有對分區(qū)進(jìn)行umount的操作,在重啟之前系統(tǒng)會(huì)調(diào)用sync命令強(qiáng)制把磁盤緩沖的所有數(shù)據(jù)寫入磁盤,而在急救模式下必須對所掛的分區(qū)進(jìn)行umount的操作,系統(tǒng)才會(huì)調(diào)用sync命令強(qiáng)制把磁盤緩沖的所有數(shù)據(jù)寫入磁盤,請?jiān)诩本饶J较碌呐笥炎⒁膺@個(gè)問題 。其實(shí)“reboot -n(Don’t sync before reboot or halt)”在重啟之前不用sync命令強(qiáng)制把磁盤緩沖的所有數(shù)據(jù)寫入磁盤,就很能說明問題 。所以要 cp 完之后要執(zhí)行 sync 命令將緩沖區(qū)的內(nèi)容寫到磁盤中,然后再umount 就不會(huì)出現(xiàn)延時(shí)了. s3c2440 SD卡(for LINUX)驅(qū)動(dòng)代碼下載地址: http://handhelds.org/cgi-bin/cvsweb.cgi/linux/kernel26/drivers/mmc/s3c2440mci.c

    推薦閱讀