|
|||||||||||
| 技術交流 | 電路欣賞 | 工控天地 | 數字廣電 | 通信技術 | 電源技術 | 測控之家 | EMC技術 | ARM技術 | EDA技術 | PCB技術 | 嵌入式系統 驅動編程 | 集成電路 | 器件替換 | 模擬技術 | 新手園地 | 單 片 機 | DSP技術 | MCU技術 | IC 設計 | IC 產業 | CAN-bus/DeviceNe |
哪位大蝦能提供一點塊設備驅動程序的資料。 |
| 作者:深思 欄目:驅動編程 |
LDD2 看了幾遍,理解不透。 字符設備好懂,塊設備太難了,理不清頭緒。 |
| 2樓: | >>參與討論 |
| 作者: 深思 于 2005/6/16 9:03:00 發布:
LDD關于塊介紹少了點,源碼結構又上復雜了點。 俺只看懂了注冊塊設備,設置塊設備參數,然后初始化缺省對列,提供request函數,request函數的中搞定 read、write。但其驅動原理(路線)上弄不明白,也就是最終是如何到 request 的。 大蝦也人,也要吃飯。沒錯,俺菜鳥也要吃飯。 |
|
| 3樓: | >>參與討論 |
| 作者: 宇宙飛船 于 2005/6/16 10:51:00 發布:
難得見到深思前輩浮水,只可惜我沒有做過 我的一點過往經驗,用PROTEL99 把別人的程序愎恢成流程圖,對著流程圖思考或者會有煥然一新的感覺! |
|
| 4樓: | >>參與討論 |
| 作者: 三元 于 2005/6/16 12:52:00 發布:
TO wuhan9719 深思不是什么大蝦,只是個普普通通的小工程師而已。 跟所有的普通人一樣,深思要吃飯,還要吃好吃的,而且跟所有的普通人一樣,不喜歡作飯,不喜歡洗碗。 可是,即使如此,評什么要被人嘲諷呢? |
|
| 5樓: | >>參與討論 |
| 作者: 瘋海龍 于 2005/6/17 6:16:00 發布:
re 宇宙飛船也算是前無古人,后無來者的曠古齊人了,居然可以用PROTEL99 把別人的程序愎恢成流程圖。 兄弟啊?你知道PROTEL99是干嗎用的么? 趕緊去PCB技術版掃盲吧。 |
|
| 6樓: | >>參與討論 |
| 作者: 深思 于 2005/6/17 8:52:00 發布:
又成了水帖了,郁悶中...... |
|
| 7樓: | >>參與討論 |
| 作者: 深思 于 2005/6/17 8:54:00 發布:
瘋大蝦,讓你公司的那些高手們也出來傳傳道么。 |
|
| 8樓: | >>參與討論 |
| 作者: 深思 于 2005/6/18 9:28:00 發布:
哎,先整個簡單的,回頭直接看 MTD 算了, static int __init mmc_media_init( void ) { int i, result; mmc_devfs_handle = devfs_mk_dir(NULL, DEVICE_NAME, NULL); if (!mmc_devfs_handle) return -EBUSY; result = devfs_register_blkdev(mmc_major, DEVICE_NAME, &mmc_bdops); if (result < 0) { printk(KERN_WARNING "Unable to get major %d for MMC media\n", mmc_major); return result; } if (!mmc_major) mmc_major = result; /* Set up GLOBAL block arrays */ read_ahead[mmc_major] = rahead; // rahead=8 for (i=0; i<MMC_NDISK; i++) // MMC_NDISK=16 mmc_blk[i] = 512; hardsect_size[mmc_major] = mmc_blk; blksize_size[mmc_major]= mmc_blk; for(i=0; i < MMC_NDISK; i++) mmc_max[i] = maxsectors; max_sectors[mmc_major] = mmc_max; /* Start with zero-sized partitions : we'll fix this later */ memset(mmc_sizes, 0, sizeof(int) * MMC_NDISK); blk_size[mmc_major] = mmc_sizes; /* Fix up the gendisk structure */ mmc_gendisk.part = mmc_partitions; mmc_gendisk.sizes = mmc_sizes; mmc_gendisk.nr_real = 0; mmc_gendisk.de_arr = &mmc_devfs_handle; mmc_gendisk.flags = &mmc_gendisk_flags; mmc_gendisk.fops = &mmc_bdops; /* Add ourselves to the GLOBAL list */ mmc_gendisk.major = mmc_major; add_gendisk(&mmc_gendisk); blk_init_queue(BLK_DEFAULT_QUEUE(mmc_major), DEVICE_REQUEST); return mmc_register_media_driver(&mmc_driver); } |
|
| 9樓: | >>參與討論 |
| 作者: zhousd 于 2005/6/19 19:37:00 發布:
狂人?真是狂了? |
|
| 10樓: | >>參與討論 |
| 作者: csword 于 2005/6/20 8:48:00 發布:
我想是這樣的 注冊塊設備->設置塊設備參數->然后初始化缺省對列->提供request函數 當需要讀取塊設備時通過ll_rw_block獲取request,request函數搞定 read、write,還要將當前設備的dev->current_request置為下一個(相當于傳接力棒),這樣所有request得到執行,直到dev->current_request為空.不知道我的理解對不對. |
|
| 11樓: | >>參與討論 |
| 作者: 宇宙飛船 于 2005/6/20 9:05:00 發布:
深思前輩這么快就搞定了,恭喜!恭喜! 其實PROTELL99作流程圖中的箭頭可用先定義一個元件庫,作好后。 先放一個在原理圖上,把不要的標注符號去丟,然后COPY,一次生成幾十個疊在一起放在旁邊備用。 當然同專用的畫流程圖的工具比起來可能沒有那么方便和高效,不過用慣了倒覺得它有點萬能的感覺。 我以前還曾經用它來研究:作一條已知dy和dx,dy*dx函數曲線;觀看sinx/x 的極限;分解DDS中的合成波形等等。把這些抽象變成形象的感性認識來幫助理解。 |
|
| 12樓: | >>參與討論 |
| 作者: 深思 于 2005/6/20 9:06:00 發布:
csword:你的分析是對的,最簡應用夠了。 想了解一些關于隊列如何重新排序、操作合并等, 另一個,我想直接看 MTD 算了,畢竟俺們目前也只是加點NAND,CF卡什么的。 你認為如何? |
|
| 13樓: | >>參與討論 |
| 作者: csword 于 2005/6/20 10:13:00 發布:
隊列不需要重新排布的 如果我的分析沒錯的話,那linux對塊設備的處理機制應該就一直沒有變過,因為我看的內核是1.0版. 隊列不需要重新排布的,在end_request里面直接CURRENT = req->next;就完事了,request隊列在插入時已經排好隊了. |
|
| 14樓: | >>參與討論 |
| 作者: csword 于 2005/6/20 10:19:00 發布:
至于MTD,俺還不知道它是什么東西,好像叫什么"抽象層"?^_^ |
|
| 15樓: | >>參與討論 |
| 作者: 深思 于 2005/6/20 10:59:00 發布:
隊列好象需要自己處理的,內核不可能提供通用的排隊方法吧 硬盤需要考慮磁頭移動最優化,但無磁頭設備呢, MTD(MEMORY TECHNOLOGY DEVICE內存技術設備)是用于訪問MEMORY設備(ROM、FLASH)的Linux的子系統。MTD的主要目的是為了使新的MEMORY設備的驅動更加簡單,為此它在硬件和上層之間提供了一個抽象的接口。 呵呵,偷個懶,讓牛人去解決中間層。 |
|
| 16樓: | >>參與討論 |
| 作者: csword 于 2005/6/20 11:17:00 發布:
在add_request時已經做了排隊優化了,使用"電梯算法" end_request時直接將指針向后移 |
|
|
|
Copyright © 1998-2006 www.qxvs.cn 浙ICP證030469號 |