Linux驱动编写模板

1、驱动入口函数

定义一个名为 xxx_init 的驱动入口函数,并且使用“__init”来修饰

static int __init xxx_init(void)
{
	/*入口函数的具体内容*/
	return 0}

2、驱动出口函数

定义一个名为 xxx_exit 的驱动出口函数,并且使用“__exit”来修饰

static int __exit xxx_exit(void)
{
	/*出口函数的具体内容*/
}

3、将1和3指定为驱动的入口和出口函数

调用函数 module_init 来声明 xxx_init 为驱动入口函数,当加载驱动的时候 xxx_init函数就会被调用,调用函数module_exit来声明xxx_exit为驱动出口函数,当卸载驱动的时候xxx_exit函数就会被调用

module_init(xxx_init);
module_exit(xxx_exit);

4、字符设备的注册

字符设备注册的原型

static inline int register_chrdev(unsigned int major, const char *name,const struct file_operations *fops)

major: 主设备号, Linux 下每个设备都有一个设备号,设备号分为主设备号和次设备号两部分
name:设备名字,指向一串字符串
fops: 结构体 file_operations 类型指针,指向设备的操作函数集合变量

字符设备的注册在驱动模块的入口函数 xxx_init 中进行

/* 驱动入口函数 */
static int __init xxx_init(void)
{
/* 入口函数具体内容 */
	int retvalue = 0;
/* 注册字符设备驱动 */
	retvalue = register_chrdev(200, "chrtest", &test_fops);
	if(retvalue < 0){
		/* 字符设备注册失败,自行处理 */
	}
	return 0;
}

5、字符设备的注销

字符设备注销的原型

static inline void unregister_chrdev(unsigned int major, const char *name)

major: 要注销的设备对应的主设备号
name: 要注销的设备对应的设备名
字符设备的注销在驱动模块的出口函数 xxx_exit 中进行

/* 驱动出口函数 */
static void __exit xxx_exit(void)
{
	/* 注销字符设备驱动 */
	unregister_chrdev(200, "chrtest");
}

6、添加LICENSE和作者信息

LICENSE 是必须添加的,否则的话编译的时候会报错,作者信息可以添加也可以不添加。

MODULE_LICENSE() //添加模块 LICENSE 信息
MODULE_AUTHOR() //添加模块作者信息

在编写好.c文件和Makefile文件之后,将.c文件编译生成.ko文件。再编写测试用的App文件,将App文件使用arm-linux-gnueabihf-gcc进行编译。最后将生成的.ko和App文件复制到开发板的额lib/modules/4.1.15/目录下既可以进行测试。其中4.1.15是内核的版本号,要相对应,否则可能会报错。

7、加载驱动文件

使用如下命令进行驱动文件的加载

insmod chrdevbase.ko
modprobe chrdevbase.ko

使用如下命令查看系统中的设备信息:

cat /proc/devices

使用如下命令创建设备节点文件:

mknod /dev/chrdevbase c 200 0

mknod:是创建节点命令,
/dev/chrdevbase:是要创建的节点文件,
c:表示这是个字符设备,
200:是设备的主设备号,
0:是设备的次设备号.
卸载驱动设备:

rmmod chrdevbase.ko

备注:
1、insmod 命令不能解决模块的依赖关系,比如 drv.ko 依赖 first.ko 这个模块,就必须先使用insmod 命令加载 first.ko 这个模块,然后再加载 drv.ko 这个模块。但是 modprobe 就不会存在这个问题,modprobe 会分析模块的依赖关系,然后会将所有的依赖模块都加载到内核中,因此modprobe 命令相比 insmod 要智能一些。 modprobe 命令主要智能在提供了模块的依赖性分析、错误检查、错误报告等功能,推荐使用 modprobe 命令来加载驱动。
2、驱动模块的卸载使用命令“rmmod”,也可以使用“modprobe -r”命令。使用 modprobe 命令可以卸载掉驱动模块所依赖的其他模块,前提是这些依赖模块已经没有被其他模块所使用,否则就不能使用 modprobe 来卸载驱动模块。所以对于模块的卸载,还是推荐使用 rmmod 命令。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值