Linux字符设备驱动编程

加入内核源码树外

① 建立两个文件scull.cscull.h,以及Makefile文件

Makefile文件

Linux字符设备驱动编程

② 用make进行编译,生成scull.ko驱动程序模块

 

Linux字符设备驱动编程

③ 把scull.ko模块加载到内核,并且查看scull.ko驱动

 

Linux字符设备驱动编程

④ 查看当前设备使用的主设备号,主设备号为260

 

Linux字符设备驱动编程

⑤ 首先应该在/dev/目录下创建与该驱动程序相对应的文件节点,查看创建好的驱动程序节点文件并修改scull的权限。

 

⑥ 编写test.c程序,来对驱动程序进行测试。编译并执行该程序

 

Linux字符设备驱动编程

移除驱动模块

 

Linux字符设备驱动编程

加入内核源码树里面

① 把驱动程序(模块程序)拷贝到内核源码树根目录下/drivers/char下

 

Linux字符设备驱动编程

② 编译配置文件Kconfig,加入驱动选项,使之在make menuconfig的时候出现改模块选项

 

Linux字符设备驱动编程

③ 在内核根目录下执行make menuconfig

 

Linux字符设备驱动编程

④ 没有安装curses库,安装。

 

Linux字符设备驱动编程

⑤ 在内核根目录下执行make menuconfig,找到驱动模块,设置启动为M

 

Linux字符设备驱动编程

⑥ 在模块文件所在目录的Makefile中加入要编译的驱动模块文件

 

Linux字符设备驱动编程

⑦  在源代码根目录linux下,执行make bzImage后执行make modules

 

Linux字符设备驱动编程

⑧  在char目录下查看得知device1.ko已经存在

 

Linux字符设备驱动编程

⑨  lsmod指令安装模块文件,再对驱动程序进行测试。编译并执行该程序

 

代码:

#ifndef _MEMDEV_H_
#define _MEMDEV_H_

#ifndef MEMDEV_MAJOR
#define MEMDEV_MAJOR 260 /*预设的mem的主设备号*/
#endif

#ifndef MEMDEV_NR_DEVS
#define MEMDEV_NR_DEVS 2 /*设备数*/
#endif

#ifndef MEMDEV_SIZE
#define MEMDEV_SIZE 4096
#endif

/*mem设备描述结构体*/
struct mem_dev
{
  char *data;
  unsigned long size;
};

#endif /* _MEMDEV_H_ */

scull.h

------------------------------------------------------------------------

#include <linux/module.h>
#include <linux/types.h>
#include <linux/fs.h>
#include <linux/errno.h>
#include <linux/mm.h>
#include <linux/sched.h>
#include <linux/init.h>
#include <linux/cdev.h>
#include <asm/io.h>
#include <asm/switch_to.h>
#include <asm/uaccess.h>
#include <linux/slab.h>

#include "scull.h"

static int mem_major = MEMDEV_MAJOR;

module_param(mem_major, int, S_IRUGO);

struct mem_dev *mem_devp; /*设备结构体指针*/

struct cdev cdev;

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/e8a511346f02d502ada55a50e4a82a66.html