IMX257实现Ramblock驱动程序编写

发布者:HeavenlyWhisper最新更新时间:2024-08-13 来源: cnblogs关键字:驱动程序 手机看文章 扫描二维码
随时随地手机看文章

今天,我们再内存中申请一片内存,模拟作为块设备,程序如下:


程序一:简单的一个小程序


1.定义gendisk结构体与request_queue请求队列结构体,以及file-operation结构体

gendisk结构体,主要是用于定义与内核,硬件有关的一些重要信息,还有就是,告诉内核定义请求队列的结构体以及操作函数的结构体。


请求队列:主要是提供读写能力,实现读写请求的存储,然后自己调用do_rambloc_request函数来实现读写操作。


操作函数:如字符设备的操作函数一样,不过此处的操作函数暂时不需定义任何函数,但是必须要有.MODULE属性,否则会报错


2.入口函数实现

如图所示,在入口函数中主要包含了以下几个操作。


1):分般gendisk结构体,并且设备此设备个数为16个


2):分配、初始化队列,并且指定队列读写函数do_ramblock_request函数。


3):设置以下虚拟块设备的一些属性,包括主设备号,次设备号,名字,操作函数,队列,设备容量等。

4):最后就是注册gendisk结构体。


3.读写函数实现


一些都准备就绪之后,当用户对虚拟块设备发出请求时,系统会调用读写函数do_ramblock_request来实现读写功能。但是刚开始,还是简单点,所以此处,我们的函数主要的功能就是打印信息,告诉我们是否进入了这个读写函数。

4.出口函数实现


和入口函数相反,出口函数主要负责的就是释放前面申请的内存,反注册前面注册的一些信息。

5.程序测试


加载成功:

附上驱动程序ramblock1:


 1 /* 参考

 2  * driversblockxd.c

 3  * driversblockz2ram.c

 4  */

 5 #include

 6 #include

 7 #include

 8 #include

 9 #include

10 #include

11 #include

12 #include

13 #include

14 #include

15 #include

16 #include

17 #include

18 #include

19 #include

20 #include

21 

22 #include

23 #include

24 #include

25 

26 static struct gendisk *ramblock_disk;     //定义gendisk结构体

27 static struct request_queue *ramblock_queue;     //定义请求队列结构体

28 static DEFINE_SPINLOCK(ramblock_lock);    //定义一个自旋锁

29 static int major;                        //主设备号

30 #define RAMBLOCK_SIZE (1024*1024)        //块设备的容量

31 

32 

33 //file_operation结构体

34 static struct block_device_operations ramblock_fops ={

35     .owner        = THIS_MODULE,

36 };

37 

38 //读写处理函数

39 static void do_ramblock_request(struct request_queue *q)

40 {

41     static int cnt = 0;

42     struct request *req;

43     

44     printk('enter do_ramblock_request %dn',++cnt);

45     

46     req = blk_fetch_request(q);

47     while(req){

48         printk('enter while req %dn',++cnt);

49         break;

50     }

51 

52     __blk_end_request_cur(req, 0);

53     printk('leave do_ramblock_request %dn',++cnt);

54 }

55 

56 static int ramblock_init(void)

57 {

58     printk('ramblock_initn');

59     /* 1.分配一个gendisk结构体 */

60     ramblock_disk = alloc_disk(16); //次设备号个数:分区个数,若为1的话,则意思是只有一个分区

61     

62     /* 2.设置 */

63     /* 2.1 分配/设置队列:函数do_ramblock_request提供读写能力 */

64     ramblock_queue = blk_init_queue(do_ramblock_request, &ramblock_lock);

65     

66     /* 2.2 设置其他属性:比如容量 */

67     major = register_blkdev(0,'ramblock');        //cat /proc/device 动态申请一个主设备号

68     

69     ramblock_disk->major = major;                //主设备号

70     ramblock_disk->first_minor = 0;             //第一个次设备号

71     sprintf(ramblock_disk->disk_name, 'ramblock');

72     ramblock_disk->fops = &ramblock_fops;        //操作函数

73     ramblock_disk->queue = ramblock_queue;        //队列

74     set_capacity(ramblock_disk,RAMBLOCK_SIZE/512);    //设置容量,以扇区为单位

75     

76     /* 3.注册 */

77     add_disk(ramblock_disk);    

78     

79     return 0;

80 }

81 

82 static void ramblock_exit(void)

83 {

84     printk('ramblock_exitn');

85     unregister_blkdev(major, 'ramblock');        //卸载主设备号

86     del_gendisk(ramblock_disk);

87     put_disk(ramblock_disk);

88     blk_cleanup_queue(ramblock_queue);

89 }

90 

91 module_init(ramblock_init);

92 module_exit(ramblock_exit);

93 MODULE_LICENSE('GPL');


程序二:增加读写方向,实现挂载等功能


接着前面实现的驱动程序,我们来在它的基础是来实现读写功能以及挂载等功能,


1.分配、释放申请内存


很明显,实现读写的话,那必要要有内存来存储,所以我们必须要入口函数中增加申请内粗的函数。


既然在入口函数中申请了内存,自然就要在出口函数中实现释放内存的操作。

2.在读写函数中实现读写操作。


由于2.6内核的改动,读写函数中的一些对象的名称有点不太一样,不过总体的思路还是一模一样的。参考内核中其他代码的读写函数,


1):实现引入请求队列,并且遍历请求队列


2):当请求队列为真的时候,计算出请求队列的起始地址及长度


3):通过其实地址和长度判读请求是否有效是否超出内存


4):如果以上都通过之后,接下来就是关键了,判断读写方向,接着实现内存的memcpy


5):读写成功后,调用__blk_end_request_cur来返回读写成功与否


3.程序测试

加载驱动:

读写测试:


4.往开发板中增加mkfs命令


接下来就是使用使用mkfs来格式化,但是发现imx257开发板自带的2.6内核里面没有mkfs的命令.


解决办法:使用busybox来创建一个根文件,然后从那个根文件系统中把mkfs命令拷贝到开发板的sbin目录下,就可以了,步骤如下:


1.首先下载busybox-1.23.1.tar.bz2


2.编译busybox


2.1配置busybox


执行命令:make menuconfig ARCH=arm CROSS_COMPILE=arm-none-linux-gnueabi-


 Busybox Settings --->        //BusyBox的通用配置,一般采用默认值即可。


---Applets

    Archival Utilities --->        //压缩、解压缩相关工具。

    Coreutils --->            //最基本的命令,如cat、cp、ls等。

    Console Utilities --->        //控制台相关命令。

    Debian Utilities --->        //Debian操作系统相关命令。

    Editors --->            //编辑工具,如vi、awk、sed等。

    Finding Utilities --->        //查找工具,如find、grep、xargs。

    Init Utilities --->        //BusyBox init相关命令。

    Login/Password Management Utilities ---> //登陆、用户账号/密码等方面的命令。

    Linux Ext2 FS Progs --->    //ext2文件系统的一些工具。

    Linux Module Utilities --->    //加载/卸载模块等相关的命令。

    Linux System Utilities --->    //一些系统命令。

    Miscellaneous Utilities --->    //一些不好分类的命令,如crond、crontab。

    Networking Utilities --->    //网络相关的命令和工具。

    Print Utilities --->        //print spool服务及相关工具。

    Mail Utilities --->        //mail相关命令。

    Process Utilities --->        //进程相关命令,如ps、kill等。

    Runit Utilities --->        //runit程序。

    Shells --->             //shell程序。

    System Logging Utilities --->    //系统日志相关工具,如syslogd、klogd。


2.2创建文件系统目录


2.2.1.创建文件系统的目录


1 #mkdir /home/study/nfs_home/rootfs_imx257/

2 #cd /nfs_home/rootfs_imx25

3 #mkdir bin dev etc lib sbin proc sys var mnt tmp usr

4 #mkdir usr/bin usr/lib usr/sbin lib/modules

2.2.2.创建设备节点


#cd dev/

#mknod -m 666 console c 5 1 

#mknod -m 666 null c 1 3


2.3配置选项


必须选中和修改的项:

1.'Build Busybox as a static binary(no share libs)'

2.'Don't use /usr'

3.'cross compiler prefix'--------->arm-none-linux-gnueabi-


4.'Busybox Installation prefix'--->/home/study/nfs_home/rootfs_imx257/


****注意此处为你的文件系统目录的路径

(1选择的是静态连接库的方式,如果不选就是使用动态连接库的方式)

(采用动态连接库的方式,在lib目录中添加应用程序所需的库文件)

(Archival Utilities-->gzip这个选项一定不能掉)


找不到的话可以按下/进行搜索.


如图所示:

2.4错误解决


2.4.1错误一


root@Lover雪:/home/study/nfs_home/system/busybox-1.23.1# make CC miscutils/ubi_tools.o

miscutils/ubi_tools.c:67:26: error: mtd/ubi-user.h: No such file or directory

miscutils/ubi_tools.c: In function 'ubi_tools_main':

miscutils/ubi_tools.c:106: error: 'UBI_DEV_NUM_AUTO' undeclared (first use in this function)

miscutils/ubi_tools.c:106: error: (Each undeclared identifier is reported only once

miscutils/ubi_tools.c:106: error: for each function it appears in.)

miscutils/ubi_tools.c:107: error: 'UBI_VOL_NUM_AUTO' undeclared (first use in this function)

miscutils/ubi_tools.c:114: error: field 'attach_req' has incomplete type

miscutils/ubi_tools.c:115: error: field 'mkvol_req' has incomplete type

miscutils/ubi_tools.c:116: error: field 'rsvol_req' has incomplete type

miscutils/ubi_tools.c:177: error: 'UBI_IOCATT' undeclared (first use in this function)

miscutils/ubi_tools.c:190: error: 'UBI_IOCDET' undeclared (first use in this function)

miscutils/ubi_tools.c:233: error: 'UBI_DYNAMIC_VOLUME' undeclared (first use in this function)

miscutils/ubi_tools.c:235: error: 'UBI_STATIC_VOLUME' undeclared (first use in this function)

miscutils/ubi_tools.c:238: error: 'UBI_MAX_VOLUME_NAME' undeclared (first use in this function)

miscutils/ubi_tools.c:243: error: 'UBI_IOCMKVOL' undeclared (first use in this function) 

miscutils/ubi_tools.c:256: error: 'UBI_IOCRMVOL' undeclared (first use in this function) 

miscutils/ubi_tools.c:274: error: 'UBI_IOCRSVOL' undeclared (first use in this function) 

miscutils/ubi_tools.c:290: error: 'UBI_IOCVOLUP' undeclared (first use in this function) 

scripts/Makefile.build:197: recipe for target 'miscutils/ubi_tools.o' failed

make[1]: *** [miscutils/ubi_tools.o] Error 1

Makefile:741: recipe for target 'miscutils' failed

make: *** [miscutils] Error 2

解决方法


拷贝linux内核中的ubi-user.h到busybox下的mtd目录中


mkdir ./include/mtd;cp ../linux-2.6.31/include/mtd/ubi-user.h ./include/mtd/

2.4.2错误二:


networking/udhcp/dhcpc.c: In function 'udhcp_recv_raw_packet':

networking/udhcp/dhcpc.c:852: error: invalid application of 'sizeof' to incomplete type 'struct tpacket_auxdata'

networking/udhcp/dhcpc.c:915: error: 'PACKET_AUXDATA' undeclared (first use in

解决方法:不要编译dhcp模块

e5dfefd8f5f66f016894127ead1a43a4_151448291513652.png

2.5编译安装


配置好之后,运行编译命令:make ARCH=arm CROSS_COMPILE=arm-none-linux-gnueabi-


安装入文件系统:make install

2.6 利用busybox的命令格式化


不必挂载文件系统,只需要利用nfs进入busybox创建的文件系统中,拷贝格式化的mkfs命令到/sbin/下,然后就可以开始格式化了

2.6.1格式化文件系统

f76501e31a125a8a00deafc29d573c59_151448421206657.png3挂载文件系统到/mnt/blk/上

1dc20a1b19fc6f86fcbb4d25b898d06f_151502157296094.png

4读写测试:


建立一个hello.c文件

 

5退出/mnt/blk/目录之后,卸载/mnt/blk/,运行sync是为了同步读写,防止设备忙

[1] [2] [3] [4] [5]
关键字:驱动程序 引用地址:IMX257实现Ramblock驱动程序编写

上一篇:S3C2440 nor_flash驱动程序
下一篇:LRF020 DRIVER FOR LINUX(BASED ON TQ2440/ARM9)

推荐阅读最新更新时间:2024-11-12 22:53

国产W806 SPI主机/从机驱动程序
一段时间芯慌后国外芯片价格飙升,国内芯片厂突然崛起;乘此机会使用了该芯片做了一批产品,经过一段时间测试芯片稳定性还可以,工作在电磁环境较差的电源监控中没有出现复位死机现象。 关于该国产芯片资料实在是很少,官方对该芯片的pdf 寄存器描述非常简单; SPI从机驱动程序: void slave_spiInit(void) { __HAL_RCC_SPI_CLK_ENABLE();// enable SPI clk // SPI GPIO MAP ... __HAL_AFIO_REMAP_SPI_CS(GPIOB,GPIO_PIN_4);//NSS __HAL_AFIO_REMAP_SPI_CLK(G
[单片机]
国产W806 SPI主机/从机<font color='red'>驱动程序</font>
122x32液晶1520控制器驱动程序(C51)
简介:本文主要介绍了122x32液晶1520控制器驱动程序(C51)。 #include reg51.h #include intrins.h #include absacc.h #include .incASCII816.h //标准ASCII码库 #include .incHZTable.h //自制的汉字库 #include .incmenu.h //自制的菜单库 sbit LCD12232_A0=P3^3; sbit LCD12232_RW=P3^1; //读写 sbit LCD12232_E1=P3^5; //片选1(Master) sbit LCD12232_E2=P3^4; /
[单片机]
linux驱动程序之电源管理之新版linux系统设备架构中关于电源管理方式的变更
新版linux系统设备架构中关于电源管理方式的变更 based on linux-2.6.32 一、设备模型各数据结构中电源管理的部分 linux的设备模型通过诸多结构体来联合描述,如struct device,struct device_type,struct class, struct device_driver,struct bus_type等。 @kernel/include/linux/devices.h中有这几中结构体的定义,这里只列出和PM有关的项,其余查看源码: struct device{ ... struct dev_pm_info power; ... } struct
[单片机]
STM32 SST25VF016B驱动程序
///** // ****************************************************************************** // * @file stm32f10x_SST25VF016B.c // * @brief SST25VF10B驱动程序 // ****************************************************************************** // * @ // * 接口定义(STM32 SPI1) // * CE--PA4 SO--PA6 SCK--PA5 SI--PA7 // * // *
[单片机]
51单片机之LCD1602的驱动程序
#include  reg52.h    #include "./delay/delay.h"      #define LCDPORT P0   #define LCD_WRITE_DATA   1   #define LCD_WRITE_COM    0   sbit RS = P2^4;   sbit RW = P2^5;   sbit E = P2^6;   unsigned char flag = 1;   unsigned char shi = 23, fen = 59, miao = 50;      void lcd1602_write(unsigned char byte, unsign
[单片机]
Imagination展示突破性的汽车图形处理器安全关键驱动程序
向实现汽车市场中的安全关键3D图形迈出第一步 Imagination Technologies 宣布,公司已为其汽车图形处理器(GPU)开发全新的OpenGL® SC(Safety-Critical,安全关键)2.0驱动程序,从而使整车厂(OEM)和一级供应商(Tier 1)可以在安全关键型应用中受益于GPU加速。数字仪表盘、刻度盘、仪表集群、驾驶舱域控制器、环视显示器和先进驾驶辅助系统(ADAS)等汽车应用,现在可以在新增的保护层下运行。 OpenGL SC驱动程序的演示展示了一个在现有汽车芯片上运行的、 带有安全关键组件的先进仪表盘 。更多信息可以在 相关博客文章 中了解。 Imagination Techno
[汽车电子]
Imagination展示突破性的汽车图形处理器安全关键<font color='red'>驱动程序</font>
Android系统下CAN总线驱动程序的设计与实现
Android是指“机器人”,由Google公司于2007年11月5日发布的基于Linux平台的开源手机操作系统,是首个为移动终端打造的真正开放和完整的移动软件。Android是一个开放平台,在嵌入式移动设备领域里具有良好的应用前景,但在不同的设备上往往有不同的硬件支持,要在Android中添加这些硬件应用,不是单纯地在Linux内核中添加驱动模块,还必须在用户空间和应用框架中添加对应的支持。 控制器局域网络(Control Area Network,CAN),属于现场总线的范畴,是德国Bosch公司在20世纪80年代初,为解决现代汽车中众多的控制与测试仪器之间的数据交换而开发的一种串行数据通信总线。由于CAN总线的数据通信具有良
[嵌入式]
C51单片机——红外遥控 驱动程序
本文为学习HC6800-EM3 V2.2开发板的学习笔记汇总,本文所用 红外接收头的引脚封装如图下: 驱动函数封装 声明:请自行根据晶振编写相匹配的延时函数; IrReceive.h文件 #ifndef __IRRECEIVE_H__ #define __IRRECEIVE_H__ #include delay.h //请自行根据晶振编写相匹配的延时函数; typedef struct{ uchar usercode;//用户码 uchar cmd;//操作码 uchar ok;//完成标志位 uchar irtime; //时间控制 uint count_repeat;//重复码计数
[单片机]
C51单片机——红外遥控 <font color='red'>驱动程序</font>
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
随便看看

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved