织梦网站被做跳转还被删除文件,wordpress站点地址无法更改,wordpress创建滑块,下载网站后怎么做若该文为原创文章#xff0c;转载请注明原文出处。
报着学习态度#xff0c;接下来学习驱动是如何使用的#xff0c;从简单的helloworld驱动学习起。
开始编写第一个驱动程序—helloworld 驱动。
一、环境
1、开发板#xff1a;正点原子的ATK-DLRK3568 2、系统#xf…若该文为原创文章转载请注明原文出处。
报着学习态度接下来学习驱动是如何使用的从简单的helloworld驱动学习起。
开始编写第一个驱动程序—helloworld 驱动。
一、环境
1、开发板正点原子的ATK-DLRK3568 2、系统 buildroot 3、内核正点原子提供的虚拟机和rk3568_linux_sdk
二、驱动的基本框架
Linux 驱动的基本框架主要由模块加载函数模块卸载函数模块许可证声明模块参数 模块导出符号模块作者信息等几部分组成其中模块参数模块导出符号模块作者信息是 可选的部分也就是可要可不要。剩余部分是必须有的。 1. 模块加载函数 当使用加载驱动模块时内核会执行模块加载函数完成模块加载函数中的初始化工作。 2.模块卸载函数 当卸载某模块时内核会执行模块卸载函数完成模块卸载函数中的退出工作。 3.模块许可证声明 许可证声明描述了内核模块的许可权限如果不声明模块许可模块在加载的时候会收到“内核被污染kernel tainted”的警告。可接受的内核模块声明许可包括“GPL”“GPL v2”。 4.模块参数可选择 模块参数是模块被加载的时候可以传递给它的值。 5.模块导出符号可选择 内核模块可以导出的符号如果导出其他模块可以使用本模块中的变量或函数。 6.模块作者信息等说明可选择
三、helloworld 驱动代码
#include linux/module.h
#include linux/kernel.hstatic int __init helloworld_init(void) //驱动入口函数
{printk(KERN_EMERG helloworld_init\r\n);//注意内核打印用 printk 而不是 printfreturn 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(yifeng); //作者信息根据驱动的基本框架编写了最简单的helloworld程序加载驱动和卸载驱动时直接打印信息。
编译驱动需要内核代码环境自行编译。
根据正点原子的手册编译需要设置环境变量这里直接填写到makefile里
makefile:
# 内核目录
KERNELDIR : /home/alientek/rk3568_linux_sdk/kernel
# rk3568是arm64架构
ARCHarm64
# 交叉工具链
CROSS_COMPILE/opt/atk-dlrk356x-toolchain/usr/bin/aarch64-buildroot-linux-gnu-
export ARCH CROSS_COMPILECURRENT_PATH : $(shell pwd)
obj-m : helloworld.obuild: kernel_moduleskernel_modules:$(MAKE) -C $(KERNELDIR) M$(CURRENT_PATH) modules
clean:$(MAKE) -C $(KERNELDIR) M$(CURRENT_PATH) clean
直接make会生成helloworld.ko文件 这就是编译生成的内核驱动模块
四、测试
启动开发板把生成的helloworld.ko文件拷贝到板子上。
加载ko文件
insmod helloworld.ko查看当前加载的内核模块
lsmod查看当前系统中有没有 helloworld这个设备
cat /proc/devices结果查询不到因为没注册。
卸载驱动模块
rmmod helloworld.ko这个模块是最基础的模板下面大部分驱动都以此模板编写。
如有侵权或需要完整代码请及时联系博主。