模块-驱动-实验

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

实验一:内核模块

/* 建立实验目录添加hello.c*/

#include /* Needed by all modules */

#include /* Needed for KERN_ALERT */

#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 /* Needed by all modules */

#include /* Needed for KERN_ALERT */

#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协议

相关文档
最新文档