初步认识驱动开发
所谓的驱动开发就是在操作系统的基础上实现驱动程序。
一、驱动开发的环境:
1、在ubuntu中配置环境
内核实现、文件系统实现、驱动实现---ubuntu中实现
gcc-4.6.4----->arm-none-linux-gnueabi-gcc
通过tftp提供uImage和.dtb----提供内核
通过nfs提供文件系统rootfs
2、板子运行环境配置(三星exynos4412 ARM裸板)
1、板子上运行uboot引导程序
2、配置uboot环境变量
ipaddr
serverip
gatewayip
支持网络--uboot
bootcmd----uboot自启动模式自动执行
bootcmd tftp 41000000 uImage \; tftp 42000000 xxx.dtb\; bootm 41000000 - 42000000
bootargs----uboot提供给操作系统内核,内核知道怎么执行----执行bootm时
bootargs /dev/nfs rootfs=xxxxx:/xxxxx/rootfs rw console=ttySAC2,115200 init=/linuxrc ip=xxxxxx
3、uboot通过tftp下载内核和设备树
tftp 内存地址 uImage
tftp 内存地址 .dtb
4、uboot运行启动内核
bootm 内核地址 - 设备树地址
需要有内核和文件系统:
a、内核编译
步骤:
1、设置交叉编译环境
vim Makefile
ARCH ?= arm
CROSS_COMPILE ?= /home/ubuntu/tools/gcc-4.6.4/bin/arm-none-linux-gnueabi-
2、选择soc,找到当前硬件对应的soc芯片,必须挑选适配于当前硬件
make exynos_defconfig
生成.config------编译配置(哪些要编译,哪些不编译,内核有哪些功能)
3、针对默认的soc芯片进行裁剪适配于当前硬件
make menuconfig
4、编译内核
make uImage
5、编译设备树:描述设备信息
找最相近的外设设备树,进行修改变成当前硬件设备的设备信息描述
以默认的dts作为参考,变为我们自己的dts
cp linux-3.14/arch/arm/boot/dts/exynos4412-origen.dts linux-3.14/arch/arm/boot/dts/exynos4412-fs4412.dts
vim linux-3.14/arch/arm/boot/dts/Makefile---添加编译
6、编译设备树
make dtbs
二、驱动开发
1、编写驱动代码
用什么工具写代码
vim(任何编辑器)
查看代码工具(我们要知道Linux内核的函数原型(定义),才知道如何调用)
source insight---查看代码工具
安装source insight工具
根据文档提示安装软件
打开软件提示错误
https://blog.csdn.net/zanda_/article/details/82916744
要使用source insight工具用作查看内核代码:
在windows的文件夹下解压linux内核代码
a.设置新工程用作查看
project--->new project
在第一个对话框中,第一个文本框(行编辑器),输入工程的名字
在第二个对话框中,第一个本文框中选择刚解压的Linux内核源码目录(顶层linux-3.14),点击ok
在第三个对话框中,在对话框中选择要查看的目录/文件
需要选择的目录文件:
include
init
kernel
arch/arm/kernel
arch/arm/include/asm
driver/base
driver/char
driver/i2c
driver/spi
fs/char_dev.c
点击close关闭
重新选择project---->open project
选择刚才创建的工程名
ok
如果提示同步,则选择确认进行同步
2、写驱动
驱动代码必须有4部分:
//1、头文件#include #include //2、驱动入口函数的声明,在内核加载驱动时,执行哪个函数;在内核卸载驱动时,执行哪个函数//声明:加载时的入口声明module_init(hello_init);//声明:卸载时的入口声明module_exit(hello_exit);//3、加载函数、卸载函数的实现//加载函数的实现:当内核加载驱动(内核执行这个驱动时,就会调用的函数)static int __init hello_init(void){return 0;}//卸载函数的实现:当内核卸载驱动(内核删除这个驱动时,就会调用的函数)static void __exit hello_exit(void){}//4、协议选择GPLMODULE_LICENSE("GPL");
Linux内核如何使用模块驱动
加载:
insmod 驱动程序路径.ko
查看:
lsmod:查看当前已经加载的驱动模块
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
