ramblock.c源码:
// 参考drivers/block/xd.c,z2ram.c
#include "linux/major.h"
#include "linux/vmalloc.h"
#include "linux/init.h"
#include "linux/module.h"
#include "linux/blkdev.h"
#include "linux/bitops.h"
#include "linux/hdreg.h"
#define RAMBLOCK_SIZE 0x100000
static struct gendisk *ramblock_disk;
static struct request_queue *ramblock_queue;
static int major;
static unsigned char *ramblock_buf;
static DEFINE_SPINLOCK(ramblock_lock);
static int ramblock_getgeo(struct block_device *dev, struct hd_geometry *geo)
{
// 容量 = heads * cylinders * sectors *512
geo->heads = 2;
geo->cylinders = 128;
geo->sectors = RAMBLOCK_SIZE / 2 / 128 / 512;
return 0;
}
static struct block_device_operations ramblock_fops =
{
.owner = THIS_MODULE,
.getgeo = ramblock_getgeo,
};
static void do_ramblock_request(struct request_queue *q)
{
static int r_cnt = 0;
static int w_cnt = 0;
struct request *req;
//printk("do_ramblock_request %d\n", ++cnt);
while ((req = elv_next_request(q)) != NULL)
{
// 数据传输3要素: 源,目的,长度
// 源/目的
unsigned long offset = req->sector * 512;
// 目的/源: req->buffer
// 长度
unsigned long len = req->current_nr_sectors * 512;
if (rq_data_dir(req) == READ)
{
//printk("do_ramblock_request read %d\n", ++r_cnt);
memcpy(req->buffer, ramblock_buf+offset, len);
}
else
{
//printk("do_ramblock_request write %d\n", ++w_cnt);
memcpy(ramblock_buf+offset, req->buffer, len);
}
end_request(req, 1); // 1 - 成功
}
}
static int ramblock_init(void)
{
// 0. register_blkdev : cat /proc/devices
major = register_blkdev(0, "ramblock");
// 1. 分配gendisk
ramblock_disk = alloc_disk(2); // 0-整个磁盘, 1-第1个分区
// 2. 设置
// 2.1 设置队列: 提供读写的能力
ramblock_queue = blk_init_queue(do_ramblock_request, &ramblock_lock);
ramblock_disk->queue = ramblock_queue;
// 2.2 设置属性: 比如容量,主设备号,第1个次设备号,操作函数等
ramblock_disk->major = major;
ramblock_disk->first_minor = 0; // (major,0),(major,1),...,(major,15)
ramblock_disk->fops = &ramblock_fops;
set_capacity(ramblock_disk, RAMBLOCK_SIZE / 512);
sprintf(ramblock_disk->disk_name, "ramblock");
// 3. 硬件相关操作
ramblock_buf = vmalloc(RAMBLOCK_SIZE);
// 4. 注册
add_disk(ramblock_disk);
return 0;
}
static void ramblock_exit(void)
{
unregister_blkdev(major, "ramblock");
del_gendisk(ramblock_disk);
put_disk(ramblock_disk);
blk_cleanup_queue(ramblock_queue);
}
module_init(ramblock_init);
module_exit(ramblock_exit);
MODULE_LICENSE("GPL");
=====================================================================
Makefile文件:
KERN_DIR = /home/linux-3.0.1
all:
make -C $(KERN_DIR) M=`pwd` modules
clean:
make -C $(KERN_DIR) M=`pwd` modules clean
rm -rf modules.order
obj-m += ramblock.o
=====================================================================
测试详情参考:JZ2440块设备驱动程序的编写驱动之用内存模拟磁盘
上一篇:OK6410块设备驱动内存模拟nor_flash
下一篇:OK6410之USB设备驱动程序
推荐阅读
史海拾趣
为了实现公司的长远发展,意华于2010年开始筹备上市工作。经过多年的准备和努力,意华成功在资本市场上市,为公司的发展注入了新的活力。上市后,意华通过资本市场融资和资本运作,加速了公司的扩张和技术创新步伐。同时,公司也更加注重规范运作和透明度提升,赢得了投资者的信任和支持。
BETA Transformer Technology Corp公司深知人才是企业发展的核心动力。因此,公司高度重视人才培养和团队建设。BETA公司建立了一套完善的人才培养机制,通过内部培训、外部学习等方式不断提升员工的技能水平和综合素质。同时,公司还注重团队建设和文化建设,营造了一个积极向上、团结协作的工作氛围。这些举措使得BETA公司的员工队伍更加稳定、高效,为公司的长期发展提供了有力保障。
以上五个故事分别从不同角度描述了BETA Transformer Technology Corp公司的发展历程和取得的成就。虽然这些故事是虚构的,但它们反映了电子行业中企业可能面临的挑战和机遇,以及应对这些挑战和机遇的策略和措施。希望这些故事能够满足您的需求。
Bce Sud公司成立之初,专注于研发高效能的半导体芯片。面对市场上激烈的竞争,公司创始人凭借其在微电子领域的深厚积累,带领团队成功研发出一款具有低能耗、高稳定性的新型芯片,这一技术突破为公司在市场上打开了局面。随着这款芯片的推出,Bce Sud逐渐在电子行业树立了技术领先的形象。
面对市场的不断变化和消费者需求的日益多样化,Bce Sud始终坚持创新驱动的发展理念。公司不断推出新产品,从半导体芯片拓展到传感器、集成电路等领域,产品线日益丰富。这些创新产品不仅提升了公司的市场竞争力,也为消费者带来了更多选择。
Bce Sud公司成立之初,专注于研发高效能的半导体芯片。面对市场上激烈的竞争,公司创始人凭借其在微电子领域的深厚积累,带领团队成功研发出一款具有低能耗、高稳定性的新型芯片,这一技术突破为公司在市场上打开了局面。随着这款芯片的推出,Bce Sud逐渐在电子行业树立了技术领先的形象。
本帖最后由 paulhyde 于 2014-9-15 09:34 编辑 模拟电路故障诊断一直以来都是十分必要且有意义的,已成为热门的研究课题。传统的模拟电路故障诊断的方法也有很多种,但是它们一般都是用于诊断开路、短路这种硬故障的,难以发现在电路中的各个元器 ...… 查看全部问答∨ |
|
错误如下:Tri-state node must be driven by a TRI buffer, but is driven by primitive ROM代码如下: LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; ENTITY MODE_CONTROL IS PORT( FZ,FC:IN STD_LOGIC; & ...… 查看全部问答∨ |
需要做一个与斑马打印机USB口通信的接口,实现数据的接收和发送,功能比较单一,但需要提供全部的源代码。 报酬在2000-3000之间,最好是在北京地区的人员承接。 联系方式:159-1093-1116… 查看全部问答∨ |
根据ADS的例程编写的中断,但是在keil中调试,发现怎么也进不去中断,还会提示说找不到IRQEnable()函数,求助高手给解答一下,是启动文件的问题吗?还是keil要使能IRQ中断不是采用这种方法?… 查看全部问答∨ |
太阳能LED灯节能性的产生原理 太阳能光伏发电LED照明系统组成高效节能的太阳能光伏发电LED照明系统包括太阳能电池组、DC-DC变换器、最大功率跟踪MPPTfMaximumpowerpointtracking)控制、储存电能的蓄电池组和LED照明控制、LED光源等部分。 ...… 查看全部问答∨ |
今天终于体验到了传送中的无线打印是什么感觉了,哈哈。来与大家分享一下。本人由于工作原因,基本上每天都一直在和打印机打交道,所以一直对最新的打印机比较关注,上次去中关村的时候,听朋友说,最近要出一款新的一体机,集打印扫描于一体,而且 ...… 查看全部问答∨ |