塊裝置驅動系統分析:
功能:把記憶體劃出512k,然後利用驅動程式做成塊裝置進行相應的訪問。
#include #include #include #include #include /* printk() */
#include /* kmalloc() */
#include /* everything... */
#include /* error codes */
#include #include /* size_t */
#include /* o_accmode */
#include /* hdio_getgeo */
#include #include #include #include #include /* invalidate_bdev */
#include module_license("dual bsd/gpl");
static int major = 0;
static int sect_size = 512;
static int nsectors = 1024;
/** the internal representation of our device.
*/struct blk_dev
;struct blk_dev *dev;
/** handle an i/o request, in sectors.
*/static void blk_transfer(struct blk_dev *dev, unsigned long sector,
unsigned long nsect, char *buffer, int write)
if (write)
memcpy(dev->data + offset, buffer, nbytes);
else
memcpy(buffer, dev->data + offset, nbytes);}/*
* the ****** form of the request function.
*/static void blk_request(struct request_queue *q) }}
/** the device operations structure.
*/static struct block_device_operations blk_ops = ;/*
* set up our internal device.
*/static void setup_device()
dev->queue = blk_init_queue(blk_request, null);//塊裝置請求佇列初始化,第乙個引數為請求佇列呼叫函式,第二個引數為訊號量
if (dev->queue == null)
goto out_vfree;
blk_queue_logical_block_size(dev->queue, sect_size);//指明裝置扇區大小
dev->queue->queuedata = dev;
/* * and the gendisk structure.
*/ dev->gd = alloc_disk(1);//為塊裝置分配struct gendisk結構
if (! dev->gd)
/*初始化struct gendisk結構體
*/ dev->gd->major = major;
//塊裝置主裝置號dev->gd->first_minor = 0;
//塊裝置起始次裝置號dev->gd->fops = &blk_ops;
//塊裝置操作函式局dev->gd->queue = dev->queue;
//塊裝置請求佇列dev->gd->private_data = dev;sprintf (dev->gd->disk_name, "simp_blk%d", 0);
//塊裝置名set_capacity(dev->gd, nsectors*(sect_size/sect_size));
//裝置塊裝置扇區數add_disk(dev->gd);
//向核心新增(註冊)塊裝置return;out_vfree:if (dev->data) vfree(dev->data);}static int __init blk_init(void)dev = kmalloc(sizeof(struct blk_dev), gfp_kernel);if (dev == null) goto out_unregister; setup_device();
//建立塊裝置初始化、註冊函式,自己實現 return 0;out_unregister:unregister_blkdev(major, "sbd");return -enomem;}static void blk_exit(void)if (dev->queue)blk_cleanup_queue(dev->queue);if (dev->data)vfree(dev->data);unregister_blkdev(major, "blk");kfree(dev);}module_init(blk_init);module_exit(blk_exit);
塊裝置驅動設計流程圖:linux flash裝置驅動
儲存裝置市面上常見的有nandflash,norflash,emmc這三類 1.1 nandflash nand flash式東芝在1989年的國際固態電路研討會 isscc 上發表的,要在nandflash上面讀寫資料,要外部加主控和電路設計。nand flash具有較快的抹寫時間,而且每個儲存單...
Linux Flash驅動 1 塊裝置系統架構
塊裝置快速體驗 塊裝置是指只能以塊為單位進行訪問的裝置,塊大小一般是512個位元組的整數倍。常見的塊裝置包括硬體,sd卡,光碟等。有同學會說,加入我需要通過硬碟訪問1個位元組的資料,難道無法訪問嗎?注意這裡的512個位元組是指對硬體裝置的最小訪問單元,對應用層訪問資料的大小沒有限制。下面開始體驗一下...
Linux驅動設計硬體基礎(二)
2.2 儲存器 儲存器主要可分為唯讀儲存器 rom 快閃儲存器 flash 隨機訪問儲存器 ram 光 磁介質儲存器。rom還可再細分為不可程式設計rom 可程式設計rom prom 可擦除可程式設計rom eprom 和電可擦除可程式設計rom e2prom e2prom完全可以用軟體來擦寫,已經...