首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

嵌入式Linux下SRAM驱动程序的开发原理及应用(2)

嵌入式Linux下SRAM驱动程序的开发原理及应用(2)

3) 填充file_operations结构:
    由于用户进程是通过设备文件同硬件打交道,对设备文件的操作方式不外乎就是一些系统调用,如 open, read, write, close ……, 注意,不是fopen, fread ……,但是如何把系统调用和驱动程序关联起来呢?这需要填充file_operations数据结构:

      这个结构的每一个成员的名字都对应着一个系统调用。用户进程利用系统调用在对设备文件进行诸如read/write操作时,系统调用通过设备文件的主设备号找到相应的设备驱动程序,然后读取这个数据结构相应的函数指针,接着把控制权交给该函数。下面就讨论本模块几个重要的函数,在这里我们称之为过程或方法。
4) 对Iomap设备操作的几个重要过程及方法
a) Iomap_read()过程:函数定义如下:
static ssize_t iomap_read(struct file *file, char *buf, size_t count, loff_t *offset){} ;图2显示了Iomap_read()过程:

图2  Iomap_read()过程
b) Iomap_write()过程:函数定义如下:
static ssize_t iomap_write(struct file *file, const char *buf, size_t count,loff_t *offset) {}
与Iomap_read()过程类似,不再重复。
c) Iomap_Open方法:函数定义如下:
int iomap_open(struct inode *inode, struct file *file) {};图3显示了Iomap_Open方法:

图3  Iomap_Open方法
d) Iomap_release 方法:函数定义如下:
int iomap_release(struct inode *inode, struct file *file) {}
减少设备使用计数并return 0;
e) Iomap_ioctl方法:函数定义如下:
static int iomap_ioctl(struct inode *inode, struct file *file,unsigned int cmd, unsigned long arg) {};图4显示了Iomap_ioctl方法:

图4  Iomap_ioctl方法
5) Iomap设备注册及注销
int init_module(void) {}:注册iomap设备
res = register_chrdev(IOMAP_MAJOR, "iomap", &iomap_fops);
并为设备数组iomap_dev分配内存;
void cleanup_module(void) {}:释放iomap_dev分配的内存,注销设备iomap。

4. 测试本模块
首先以根用户身份编译模块,然后创建两个设备文件,辅编号一个是0,另一个是1。再把模块插入到内核里去。

现在编辑一个小的测试程序,对上述两个设备文件/ dev/iomap0及/dev/iomap1进行操作。其中/ dev/iomap0基地址为0xc0000000, 大小为1MB; /dev/iomap1基地址为0xc0100000, 大小为1MB。设备文件以读写方式打开。

程序编译后运行,得到预期结果。
5. 小结:
本文论述了嵌入式Linux下SRAM驱动程序的开发原理及流程,并作了测试,得到了预期结果,这样嵌入式Linux就能得到更加广泛的应用。
参考文献:
[1]. alessandro rubini & jonathan corbet.魏永明,等 译.Linux设备驱动程序.北京:中国电力出版社,2002.11
[2]. Neil Matthew, Richard Stone.杨晓云,王建桥,杨涛,高文雅,等 译.Linux程序设计. 北京:机械工业出版社,2002.1
[3].马忠梅,马广云,徐英惠,田泽.ARM嵌入式处理器结构与应用基础. 北京:北京航空航天大学出版社,2002.1
[4] .www.Hynix.com
继承事业,薪火相传
返回列表