模块-驱动-实验
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验一:内核模块
/* 建立实验目录添加hello.c*/
#include
#include
#include
static int __init test_init(void)
{
printk("Hello world 1.\n");
return 0;
}
static void __exit test_exit()
{
printk("Goodbye world 1.\n");
}
module_init(test_init);
module_exit(test_exit);
/* 在实验目录添加Makefile*/
obj-m += hello.o
PWD := $(shell pwd)
#PC机内核模块使用以下两行进行内核代码路径指定(根据需要打开#注释)
#KERN_VER = $(shell uname -r)
#KERN_DIR = /lib/modules/$(KERN_VER)/build
#ARM内核模块使用以下进行内核代码路径指定(根据需要打开#注释)
#KERN_DIR = /root/build_kernel/linux-2.6.30.4
modules:
$(MAKE) -C $(KERN_DIR) M=$(PWD) modules
clean:
rm –rf *.o *~ core .depend . *.cmd *.ko *.mod.c .tmp_versions
编译生成的内核模块可以直接加载:
insmod hello.ko
卸载模块:
rmmod hello.ko
可以通过参看系统内核日志信息来查看模块的加载与卸载情况。
tail /var/log/messages
实验二:改造Hello模块,注册字符设备
(使用老方法)
#include
#include
#include
/*添加文件操作接口有关的头文件*/
#include
#include
//第一步:定义设备号及设备名
#define TEST_MAJOR 233 //定义主设备号
static char drv_name[] = "test"; //定义主设备名
//第二步:添加设备驱动操作接口函数open和release,这两个函数在应用程序调用open 及close时调用。
static int test_chardev_open(struct inode *inode,struct file *file)
{
printk("open major=%d, minor=%d\n", imajor(inode), iminor(inode));
return 0;
}
static int test_chardev_release(struct inode *inode,struct file *file)
{
printk("close major=%d, minor=%d\n", imajor(inode), iminor(inode));
return 0;
}
//第三步:完成file_operations的赋值,为该字符设备添加设备驱动操作接口方法
static struct file_operations chardev_fops={
.owner = THIS_MODULE,
.open = test_chardev_open,
.release = test_chardev_release,
};
//第四步:在模块插入函数中添加设备注册
static int __init test_init(void)
{
printk("Hello world 1.\n");
if(register_chrdev(TEST_MAJOR,drv_name,&chardev_fops))
{
printk("fail to register device \n");
return -1;
}
return 0;
//第五步:在模块退出函数中添加设备注销
static void __exit test_exit()
{
printk("Goodbye world 1.\n");
unregister_chrdev(TEST_MAJOR,drv_name);
}
module_init(test_init);
module_exit(test_exit);
//第六步:适当添加模块说明
MODULE_LICENSE("GPL");
至此,hello.c改造完成,接下来完成设备节点创建,以方便应用程序对该驱动进行调用。
第七步:在/dev目录下使用mknod命令添加相应的设备节点文件(如果是pc机则在pc上的/dev目录,如果是开发板,则进入开发板上的/dev目录)
mknod 设备节点名(与驱动对应)设备类型(字符设备为c)主设备号(与驱动对应)次设备号
mknod test c 233 0
第八步:测试驱动,编写test.c程序
#include
#include
#include
#include
int main(void)
{
int fd;
fd = open("/dev/test", O_RDWR);
if(fd) {
printf("I am testing my device…\n");
}
close(fd);
return 0;
}
编译:arm-linux-gcc test.c -o test
使用超级终端下载到开发板
在开发板输入rx test 然后选择超级终端的文件发送功能,使用xmodem协议