第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驱动我们可以看作是驱动代码的模板。任何一个驱动代码都用它作为基础来编写实现。同学们要将他记忆下来!

相关推荐
正点原子2 天前
【正点原子Linux连载】 第十章 pinctrl和gpio子系统实验 摘自【正点原子】ATK-DLRK3568嵌入式Linux驱动开发指南
linux·运维·驱动开发
星马梦缘2 天前
“零一”智能硬件开发挑战赛 宣传稿
驱动开发·智能硬件·活动·培训·科协
小此方3 天前
Re:Linux系统篇(五十四)线程篇 · 七:互斥锁的底层实现原理:从硬件上下文、原子交换指令(Swap)到并发封装实战
linux·运维·驱动开发
芯片设计-曾工4 天前
当精准脉冲遇上清晰视界——CH2205E模块与YL1621的“黄金搭档“
驱动开发·stm32·单片机·51单片机·硬件工程
平凡的小蚂蚁6 天前
Exynos4412-POP-7inLCD裸机开发完整教程(STM32 库风格)
驱动开发·stm32·单片机·嵌入式硬件·嵌入式·硬件工程
小此方6 天前
Re:Linux系统篇(五十二)线程篇 · 五:直击 Linux 内核底层:TCB 与 LWP 一体两面全解析(附自定义线程封装)
linux·运维·驱动开发
胡八一6 天前
虚拟串口com0com安装教程
驱动开发·stm32·单片机
智者知已应修善业6 天前
【三位数字显示计时定时器设计-同步方式】2025-6-30
驱动开发·经验分享·笔记·硬件架构·硬件工程
zhangfeng11337 天前
AI编程范式:从Vibe Coding(氛围编程)向SDD规范驱动开发演进全解析
人工智能·驱动开发·ai编程
JNX_SEMI7 天前
Hi5000Q/H 6.5~75V宽输入——与H5227A完全对等,无缝适配现有电源方案-聚能芯-智芯官方授权一级代理
驱动开发·单片机·嵌入式硬件·物联网·硬件工程