Linux FLASH驅動設計二

2021-07-03 13:03:21 字數 2651 閱讀 6192

塊裝置驅動系統分析:

功能:把記憶體劃出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完全可以用軟體來擦寫,已經...