接上篇,框架搭好之后,可以进行内存模拟磁盘
3th
在ramblock_init 函数中加入硬件相关操作
static unsigned char *ramblock_buf;
static int ramblock_init(void)
{
.................
/* 3. 硬件相关操作 */
ramblock_buf = kzalloc(RAMBLOCK_SIZE, GFP_KERNEL);
.......................
}
在do_ramblock_request()函数中:
static void do_ramblock_request (struct request_queue * q)
{
static int cnt = 0;
struct request *req;
req = blk_fetch_request(q);
//printk("do_ramblock_request %d\n",++cnt);
while (req) {
/* 数据传输三要素: 源,目的,长度 */
/* 源/目的: */
unsigned long offset = blk_rq_pos(req) *512; // unsigned long offset = req->sector * 512;
/* 目的/源: */
//req->buffer;
/* 长度: */
unsigned long len = blk_rq_cur_bytes(req); // unsigned long len = req->current_nr_sectors * 512;
if (rq_data_dir(req) == READ)
memcpy(req->buffer, ramblock_buf+offset, len);
else
memcpy(ramblock_buf+offset, req->buffer, len);
/* wrap up, 0 = success, -errno = fail */
if (!__blk_end_request_cur(req, 0))
req = blk_fetch_request(q);
}
}
测试:(在Tiny6410开发板上)
在PC上查看ramblock.bin
sudo mount -o loop ramblock.bin /mnt
成功将开发板上的文件挂接到linux主机。
...........................................................................................................
跟着韦东山老师学习嵌入式驱动程序设计
...........................................................................................................