文章目录
- 一、概念
- 二、在linux内核源码的arch/arm/configs目录下生成FSMP1A板子对应的默认配置文件
- 三、将自己编写的驱动通过图形化界面的方式编译到内核的镜像文件uImage中
- (一)拷贝myled.c和myled.h文件到linux内核源码的drivers/char目录下
- (二)修改drivers/char目录下的Makefile文件,添加led灯驱动编译的信息
- 四、驱动采用模块化的方式进行编译
- (一)概念
- (二)操作步骤
- 1. 更改drivers/char/Makefile文件,添加编译信息
- 2. 更改drivers/char/Kconfig文件
- 3. 使用图形化界面配置led驱动为模块化编译
- 4. 编译linux内核的镜像文件
- 5. 模块化编译生成my_led.ko文件
- 6. 在开发板中加载驱动
一、概念
-
作者:linus
Git : 版本管理工具,
项目阶段会学习Git版本管理工具的使用,
在实际开发中一定会使用到版本管理工具。 -
linux内核源码是完全开源的
-
linux内核源码在启动的过程中会进一步对硬件进行初始化操作,
比如:网卡驱动,时钟树,串口,内存,硬盘 -
linux内核驱动代码采用模块化的设计
-
在linux内核代码中只允许使用C或者汇编代码。
-
linux内核源码使用c89标准
for (int i = 0; i < 10; i++) // 内核中不可以这样写
{
}int i;
for (i = 0; i < 10; i++) // 内核中不可以这样写
{
}void print(void) // 内核中错误
{
print(“helloworld\n”);
int a;
int b;
int sum = a + b;
}void print(void) // 内核中错误
{
int a;
int b;
int sum;
print(“helloworld\n”);
sum = a + b;
}
二、在linux内核源码的arch/arm/configs目录下生成FSMP1A板子对应的默认配置文件
- 根据.config文件拷贝生成FSMP1A板子对应的默认配置文件
cp .config arch/arm/configs/fsmp1a_defconfig
三、将自己编写的驱动通过图形化界面的方式编译到内核的镜像文件uImage中
此处以LED驱动为例
(一)拷贝myled.c和myled.h文件到linux内核源码的drivers/char目录下
(二)修改drivers/char目录下的Makefile文件,添加led灯驱动编译的信息
四、驱动采用模块化的方式进行编译
(一)概念
tristate : 对应的菜单选项有三种状态 <*> 或 < > 或 <M>
<*> : 对应的驱动被编译到uImage内核镜像中
< > : 对应的驱动不被编译到uImage内核镜像中
<M> : 对应的驱动采用模块化的方式进行编译,模块化驱动编译的命令为make modules
当一个驱动代码采用模块胡的方式进行编译时,驱动代码会被编译生成****.ko文件,
当需要使用这个驱动时,使用insmod ****.ko加载驱动到内核中,
当不需要使用这个驱动时,使用rmmod ****.ko从内核中卸载驱动。(.ko可以省略不写)
也可以使用lsmod命令查看模块化加载的驱动程序
(二)操作步骤
1. 更改drivers/char/Makefile文件,添加编译信息
2. 更改drivers/char/Kconfig文件
3. 使用图形化界面配置led驱动为模块化编译
4. 编译linux内核的镜像文件
此时led驱动文件不会被编译进内核中
5. 模块化编译生成my_led.ko文件
将.ko文件拷贝到根文件系统中:
cp drivers/char/myled.ko ~/rootfs
6. 在开发板中加载驱动