⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 简单驱动程序学习.txt

📁 一个简单的驱动程序打开linx驱动世界的大门.一个简单的字符型设备驱动程序
💻 TXT
字号:
简单的程序
实验目的:
动手实践一个简单的字符型设备驱动程序,学习驱动程序编写的基本步骤。
实验内容:
编写一个简单的字符型设备驱动程序。
预备知识:
熟悉Linux 各组成部分的作用,熟悉Linux 系统基本操作,熟练C 语言运用。
实验设备:
安装Redhat 9 的PC 机,并且配置好ARM+Linux 的开发环境
实验步骤:
1.编写驱动程序:
我们编写一个简单的字符型设备驱动程序,虽然这个驱动程序没有实际用处,但是利
用它可以开始我们学习驱动程序编写的初步。
打开PC Linux 下的一个终端,使用Vi 编辑器输入如下代码:
************************************************************************
/*
* Copyright (C) 2004
* <zhaozhenfeng@263.net>
*
This file just for ARM9-2410EP
Sat Feb 7 2004 Zhen-feng Zhao <zhaozhenfeng@263.net>
*
* This file is subject to the terms and conditions of the GNU General Public
* License. See the file COPYING in the main directory of this archive
* for more details.
*/
#include <linux/config.h>
//Linux 内核编译的时的配置文件,文件里面指向另一个由make menuconfig 自动生成的文
件autoconf.h
#include <linux/kernel.h>
#include <linux/module.h>
//关于模块驱动程序的头文件
#include <linux/sched.h>
#include <linux/interrupt.h> /* for in_interrupt */
//中断相关的头文件,如果驱动程序没有使用中断可以不需要
#include <linux/timer.h>
//系统定时器使用的头文件,如果不使用,可以不需要
#include <linux/init.h>
#include <linux/delay.h> /* for udelay */
#include <linux/modversions.h>
嵌入式系统教学平台实验教材
----- 119 -----
#include <linux/version.h>
//这个头文件里面定义了Linux 内核的版本,用于版本检查
#include <asm/io.h>
#include <asm/irq.h>
#include <asm/hardware.h>
//访问系统硬件用的头文件
#define SimpleD_MAJOR 96
//定义了SimpleD 设备的主设备号
devfs_handle_t dev_handle; /* register handle to store device fs */
//系统支持DEVFS 时用到的handle
int SimpleD_temp_count=0;
//定义的系统变量,防止文件被多重打开
/*=========SimpleD Read ===========================*/
ssize_t SimpleD_read (struct file * file ,char * buf, size_t count, loff_t * f_ops)
{
printk("s3c2410: device file-read operation!\n");
return count;
}
//SimpleD 设备对应的读操作函数
/*=========== SimpleD Write =======================*/
ssize_t SimpleD_write (struct file * file ,const char * buf, size_t count, loff_t * f_ops)
{
printk("s3c2410: device file-write operation!\n");
return count;
}
//SimpleD 设备对应的写操作函数
/*=========== SimpleD Ioctl =======================*/
ssize_t SimpleD_ioctl (struct inode * inode ,struct file * file,
unsigned int cmd, long data)
{
printk("s3c2410: device ioctl operation!\n");
}
//SimpleD 设备对应得Ioctl 函数
/*============ SimpleD device open ==============*/
ssize_t SimpleD_open (struct inode * inode ,struct file * file)
{
return 0;
}
//SimpleD 设备对应的打开函数
/*============ SimpleD device close =============*/
ssize_t SimpleD_release (struct inode * inode ,struct file * file)
{
devfs_unregister_chrdev( SimpleD_MAJOR, "SimpleD" );
嵌入式系统教学平台实验教材
----- 120 -----
devfs_unregister( dev_handle );
return 0;
}
//SimpleD 设备对应的关闭函数
struct file_operations SimpleD_ops ={
open: SimpleD_open,
read: SimpleD_read,
write: SimpleD_write,
ioctl: SimpleD_ioctl,
release: SimpleD_release,
};
//SimpleD 设备向系统注册用的OPS 结构,里面是对应的操作
//下面这个函数用于驱动程序初始化设备
static int __init HW_SimpleD_init(void)
{
int ret = -ENODEV;
int delay ;
ret = devfs_register_chrdev(SimpleD_MAJOR, "SimpleD", &SimpleD_ops);
//这里注册字符型设备,这里也可以使用module_register_chrdev 函数
if( ret < 0 ){
printk (" s3c2410: init_module failed with %d\n", ret);
return ret;
}
else {
printk(KERN_INFO" S3c2410 SimpleD register success!!!\n");
}
dev_handle = devfs_register( NULL, "SimpleD", DEVFS_FL_DEFAULT,
96, 0, S_IFCHR, &SimpleD_ops, NULL);
//注册devfs 设备
//!!!!!!!!!!!!!!
return ret;
}
//下面是系统初始化函数,完成主要的初始化任务
int __init s3c2410_SimpleD_init(void)
嵌入式系统教学平台实验教材
----- 121 -----
{
int ret = -ENODEV;
ret = HW_SimpleD_init();
if (ret)
return ret;
return 0;
}
//下面是模块的初始化函数
int init_module()
{
s3c2410_SimpleD_init();
}
//下面是模块的卸载函数
void cleanup_module()
{
printk(“Module clean up\n”);
}
*************************************************************
代码输入完成后需要编译,对驱动程序的编译和普通的应用程序有一点区别,编译的
步骤如下:
首先确定交叉编译器的路径,本系统在 /opt/host/armv4l/bin/ 下面,然后确认Linux 内
核源代码的存放位置,本系统应该在 /s3c2410_linux/kernel/ 因为编译驱动程序需要Linux
内核头文件。用如下命令调用编译器gcc 编译驱动程序:
/opt/host/armv4l/bin/arv4l-unknown-linux-gcc –D __KERNEL__ -I/s3c2410_linux/
kernel/include –DMODULE –c –o simpleD.o simpleD.c
分别解释一下含义,前面是调用包含全路径的交叉编译器, –D __KERNEL__
–DMODUL 代表编译内核模块(KERNEL 两侧分别都有两条下划线,并且和-D 之间有一
个空格),-c 表示只编译不连接,-o 指定输出的文件名,最后是需要被编译的C 文件。
如果文件输入没有错误,应该正确的完成编译,如果出现错误请检查输入是否有误。
正确编译后主要我们可以将编译好的simpleD.o 文件插入内核中。
将编译好的simpleD.o 文件复制到 /s3c2410_linux/nfs/ 下面,正确连接好实验仪后,
打开电源,在PC 的minicom 下进入Linux 系统。
输入:(192.168.0.120 指实验箱的IP,.xxx 指宿主机的IP 地址)
ifconfig eth0 192.168.0.120
ifconfig
mount 192.168.0.xxx:/s3c2410_linux/nfs /mnt
cd /mnt
insmod simpleD.o
系统输出
********************************************
s3c2410 simpleD register success!!!
嵌入式系统教学平台实验教材
----- 122 -----
********************************************
输入lsmod 可以察看模块:
lsmod
系统输出
************************************************************
Module Size Used by
simpleD 1680 0 (unused)
************************************************************
用rmmod 命令删除模块
输入:
rmmod simpleD
输入lsmod 可以察看模块:
lsmod
系统输出
****************************************************
Module Size Used by
****************************************************
通过上面的步骤,我们已经可以正确的编写、编译、插入、察看、删除模块。这些基
本操作是Linux 驱动程序开发的重要部分,熟练的应用很重要。
2.编写测试程序
正确的插入驱动程序后,需要对驱动程序进行测试。这个测试程序是运行在应用层的
用户程序。我们使用测试程序来验证我们自己的黑盒子,即验证我们自己的驱动,看看它
是否真的可以完成我们预计的工作。编写好的测试程序也可以交给其他软件开发人员,作
为对此设备使用方法的参考,所以编写相应的测试程序也是非常重要的。
前面我们编写的驱动程序,非常非常的简单,它并没有对应什么硬件设备,所以测试
程序也相应的变得非常简单,只要将驱动程序暴露的接口测试即可。
参考程序如下:
************************************************
#include <stdio.h>
#include <sys/ioctl.h>
#include <fcntl.h>
#include <unisted.h>
int main()
{
int fd;
int ret;
char buf[10];
fd=open(“/dev/simpleD”,O_RDWR);
if (fd<0)
{
printf(“Open deivce SimpleD error\n”);
}
else
{
嵌入式系统教学平台实验教材
----- 123 -----
printf(“Open device SimpleD success\n”);
}
getchar();
ret=read(fd,buf,10);
getchar();
ret=write(fd,buf,10);
getchar();
ret=ioctl(fd,1,1);
close(fd);
printf(“End of Test\n”);
return 0;
}
*******************************************************
使用交叉编译器编译并且在实验仪上运行
/opt/host/armv4l/bin/arv4l-unknown-linux-gcc –o testSimpleD testSimpleD.c
cp ./testSimpleD /s3c2410_linux/nfs
在实验仪上采用nfs 的方法运行测试程序
cd /mnt
insmod simpleD.o
./testSimpleD
测试程序能够正常的对驱动程序进行操作,就表示驱动程序功能正常,当然真正的驱
动程序会对应特定的硬件,测试程序就相应的复杂得多了。在以后的实验中,我们会开始
编写真正对应实际硬件的驱动程序。

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -