第3章 helloworld 驱动实验(iTOP-RK3568开发板驱动开发指南 )

在学习C语言或者其他语言的时候,我们通常是打印一句"helloworld"来开启编程世界的大门。学习驱动程序编程亦可以如此,使用helloworld作为我们的第一个驱动程序。

接下来开始编写第一个驱动程序---helloworld。

3.1 驱动编写

本小节来编写一个最简单的驱动------helloworld驱动。helloworld.c如下(图3-1)所示代码:

c 复制代码
#include <linux/module.h>
#include <linux/kernel.h>

static int __init helloworld_init(void)    //驱动入口函数
{
    printk(KERN_EMERG "helloworld_init\r\n");//注意:内核打印用printk而不是printf
    return 0;
}

static void __exit helloworld_exit(void)    //驱动出口函数
{
    printk(KERN_EMERG "helloworld_exit\r\n");
}

module_init(helloworld_init);    //注册入口函数
module_exit(helloworld_exit);    //注册出口函数
MODULE_LICENSE("GPL v2");    //同意GPL开源协议
MODULE_AUTHOR("topeet");    //作者信息

看似非常简单的helloworld驱动代码,却五脏俱全。一个简单的helloworld驱动包含驱动的基本框架。我们继续往下看。

3.2 驱动的基本框架

Linux驱动的基本框架主要由模块加载函数,模块卸载函数,模块许可证声明,模块参数,模块导出符号,模块作者信息等几部分组成,其中模块参数,模块导出符号,模块作者信息是可选的部分,也就是可要可不要。剩余部分是必须有的。我们来看一下这几个部分的作用:

1 模块加载函数

​ 当使用加载驱动模块时,内核会执行模块加载函数,完成模块加载函数中的初始化工作。

2 模块卸载函数

​ 当卸载某模块时,内核会执行模块卸载函数,完成模块卸载函数中的退出工作。

3 模块许可证声明

​ 许可证声明描述了内核模块的许可权限,如果不声明模块许可,模块在加载的时候,会收到"内核被污染(kernel tainted)"的警告。可接受的内核模块声明许可包括"GPL""GPL v2"。

4 模块参数(可选择)

​ 模块参数是模块被加载的时候可以传递给它的值。

5 模块导出符号(可选择)

​ 内核模块可以导出的符号,如果导出,其他模块可以使用本模块中的变量或函数。

6 模块作者信息等说明(可选择)

上一小节我们说,helloworld驱动麻雀虽小五脏俱全,我们来分析helloworld驱动。通过helloworld代码再来看驱动框架。

(1)模块加载函数:

c 复制代码
static int __init helloworld_init(void)    //驱动入口函数
{
    printk(KERN_EMERG "helloworld_init\r\n");
    return 0;
}
module_init(helloworld_init);    //注册入口函数

(2)模块卸载函数:

c 复制代码
static void __exit helloworld_exit(void)    //驱动出口函数
{
    printk(KERN_EMERG "helloworld_exit\r\n");
}
module_exit(helloworld_exit);    //注册出口函数

(3)模块许可证声明

c 复制代码
MODULE_LICENSE("GPL v2");    //同意GPL开源协议

(4)模块作者信息

c 复制代码
MODULE_AUTHOR("topeet");    //作者信息

(5)头文件

c 复制代码
#include <linux/module.h> //模块加载函数和卸载函数需要的头文件
#include <linux/kernel.h>

通过上面的分析,helloworld驱动是不是包含了驱动框架的所有必要的部分呢。因此helloworld驱动我们可以看作是驱动代码的模板。任何一个驱动代码都用它作为基础来编写实现。同学们要将他记忆下来!

相关推荐
sukalot11 小时前
window显示驱动开发—为头装载和专用监视器生成自定义合成器应用(二)
驱动开发
zwhSunday12 小时前
Linux驱动开发(1)概念、环境与代码框架
linux·运维·驱动开发
sukalot1 天前
window显示驱动开发—为头装载和专用监视器生成自定义合成器应用(三)
驱动开发
sukalot1 天前
window显示驱动开发—为头装载和专用监视器生成自定义合成器应用(一)
驱动开发
cxr8282 天前
基于Claude Code的 规范驱动开发(SDD)指南
人工智能·hive·驱动开发·敏捷流程·智能体
zwhSunday3 天前
Linux驱动开发(2)进一步理解驱动
linux·驱动开发
被遗忘的旋律.3 天前
Linux驱动开发笔记(十)——中断
linux·驱动开发·笔记
路溪非溪3 天前
Linux驱动如何向应用层提供sysfs操作接口
linux·arm开发·驱动开发
sukalot4 天前
window显示驱动开发—监视筛选器驱动程序(三)
驱动开发
墨染天姬4 天前
【android 驱动开发九】生产者-消费者模型
android·驱动开发