Linux驱动开发笔记(一):helloworld驱动源码编写、makefile编写以及驱动编译基本流程
前言
基于linux的驱动开发学习笔记,本篇是描述了一个字符驱动的基础开发流程,以便做嵌入式开发多年的应用或者系统学习驱动开发。
笔者拥有硬件基础,单片机软硬基础,linux系统基础等各种,就是没有linux驱动框架基础,未做过linux系统移植和驱动移植开发了。所以补完linux系统移植和驱动开发就基本可以打通嵌入式整套流程了,作为技术leader不一定亲自动手做,但是一定要对产品构架中的每一块业务和技术要基本清楚。
建议参考xun为的视频教程,教程整个过程非常清晰,直接给拥有很多知识基础的资深研发,可以不陷入某山的固有思维误区,也不用imx6的太过庞从汇报理解大而冗余,它能直接以最终实现目标为目的,不用从什么裸机开始做开发学习,怎么做也告诉你为什么都交代清楚,再结合多年相关从业工作经验,说实在的,一通百通可以融会贯通。从业多年,第一次推荐,因为确实真的是好东西。
- 头文件:宏定义等等
- 驱动模块的入口和出口宏:linux驱动框架
- 声明信息:linux内核模块的必要声明
- 功能实现:真正实现驱动的实体代码
包含宏定义的头文件init.h,是一些初始化和宏头文件,一些module_init,module_exit等。
#include <linux/init.h>
包含了初始化加载模块的头文件
#include <linux/module.h>
module_init()和module_exit()入口和出口宏。(PS:这里括号内实际上需要填入入口出口函数,后续再填入)
module_init();
module_exit();
告诉内核,本模块驱动有开源许可证。
MODULE_LICENSE(“GPL”);
入口函数
static int hello_init(void)
{
// 在内核里面无法使用基础c库printf,需要使用内核库printk
printk(“Hello, I’m hongPangZi\n”);
return 0;
}
出口函数
static void hello_exit(void)
{
printk(“bye-bye!!!\n”);
}
此时可以修改,步骤二的出口入口宏了
module_init(hello_init);
module_exit(hello_exit);
总结,按部就班四步法,搭建了基础的驱动代码框架。
#include <linux/init.h>
#include <linux/module.h>
static int hello_init(void)
{
// 在内核里面无法使用基础c库printf,需要使用内核库printk
printk(“Hello, I’m hongPangZi\n”);
return 0;
}
static void hello_exit(void)
{
printk(“bye-bye!!!\n”);
}
MODULE_LICENSE(“GPL”);
module_init(hello_init);
module_exit(hello_exit);
把驱动编译城模块,然后加载到内核里面。
把驱动直接编译到内核,运行内核则会直接加载驱动。
obj-m += helloworld.o
内核在哪,实际路径在哪
KDIR:=
PWD?=$(shell pwd)
all:
make -C $(KDIR) M=$(PWD) modules
make进去KDIR路径,当前路径编译成模块。
obj-m = helloworld.o
KDIR:=
PWD?=$(shell pwd)
all:
make -C $(KDIR) M=$(PWD) modules
编译驱动之前有几点要注意:
与驱动编译成的目标系统,获取对应的内核且需要编译通过。
开发板或者系统跑的内核版本需要与编译内核驱动的内核源码版本一致。
注意3:编译目标环境要确认是否是需要的构架,在内核目录下:
make menu configure
export ARCH=arm
修改构架后,可使用menu configure查看标题栏的内核构架
找到使用的arm编译器(实际为arm-linux-gnueabihf-gcc,取gcc前缀)
export CROSS_COMPILE=arm-linux-gnueabihf-
直接输入make,编译驱动,会生成hellowold.ko文件,ko文件就是编译好的驱动模块。
将驱动拷贝到开发板或者目标系统,然后使用加载指令:
insmod helloworld.ko
会打印入口加载的printk输出。
lsmod
可以查看到加载的驱动模块
rmmod helloworld
可以移除指定驱动模块(PS:卸载驱动不需要.ko后缀),卸载成功会打印之前的printk输出。
学习了驱动的基础框架,那么为了方便很好的测试,让大家都有基础环境,下一篇,将使用ubuntu18.04,编译ubuntu18.04的驱动,然后做好本篇文章的相关实战测试。
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 没有源码,如何修改代码逻辑?
· DeepSeek R1 简明指南:架构、训练、本地部署及硬件要求
· NetPad:一个.NET开源、跨平台的C#编辑器
· PowerShell开发游戏 · 打蜜蜂
2021-05-07 NSIS制作安装包笔记(一):NSIS介绍、使用NSIS默认向导脚本制作Windows安装包