SOC:
采用的A7的核
片内设备:
1、片内控制器:
i2c控制器、spi控制器、uart控制器、gpio控制器……
2、总线:
平台总线
3、片内存储器:
irom:掉电不丢失数据
iram:掉电丢失数据
片外外设:
flash:
1、dram
2、nand
uboot.bin---zImage/uImage---rootfs
其他外设:
按键、灯……
一个完整的驱动运行流程:
一、uboot.bin
1、板子一上电,irom(掉电不丢失数据)内的程序就开始运行,去读取nand flash内的数据,从0地址开始读取
2、提前将uboot.bin烧录到nand flash中去
3、irom在nand flash中读取到uboot.bin的第一部分(由于uboot.bin比较大,会分成2个部分),同时将读取到的数据加载到iram(掉电丢失数据)中运行,运行过程中,会在外部dram中初始化第一部分的uboot.bin,随后再去读取第二部分,过程和第一部分一样,进而完成整个uboot的初始化
4、随后引导内核
二、内核zImage/uImage
随后uboot引导内核:
两种方式:
方式1:
事先将内核镜像烧录到nand flash中,uboot直接去nand flash中读取内核方式2:
由网络方式下载:tftp服务(通过网线)
tftp下载内核到dram中的0x40008000,在此运行内核
最终内核是在此运行**为什们下载地址是从0x40008000开始?** 因为dram中前面还有uboot 开发一般采用方式二,为什们采用方式二: 由于内核频繁修改,修改后,每次都要烧录,效率太低故采用方式二
三、内核运行完之后,紧接着会挂在根文件系统rootfs
挂在方式:通过nfs服务挂在网络文件系统
四、前期工作准备完毕后,开发(分两种情况)
1、应用开发
由于pc机是x86架构,芯片是arm架构,架构不一样,导致指令集不一样,所以需要交叉编译
应用程序是直接放在文件系统里面,由于文件系统是共享的,所以将他放在文件系统里面, 在板子上就可以直接看到这个应用程序,也就可以直接运行了
应用程序只需在文件系统中直接运行
2、内核开发
驱动程序本身是属于内核源码的,但是由于为了开发效率,我们一般会采用以内核模块的形式开发,不直接编译进内核,而是单独编译成xx.ko文件,最后要用他的时候也还是要放到内核中去用。
怎么做呢?
通过内核的命令:insmod xx.ko //加载到内核中去
通过命令将它安装到系统,应用层就可以直接这个驱动的接口
例:
就比如我们平时用的U盘,插到电脑,会自动安装驱动到windows里面
应用程序与驱动的程序的区别
1、应用程序----是一个独立完整的程序,由main函数,从main开始运行
2、驱动程序----只是内核的一个模块,没有main函数,
目的:给应用程序提供操作硬件(设备)的函数接口
应用程序开发思路:
驱动程序开发思路:
static int __init xxx_init(void) //为驱动函数入口
static void __exit xxx_exit(void) //驱动函数的出口
驱动程序编译之后不是可执行程序,而是一个内核模块,随后通过内核命令:
加载命令:
insmod hello_drv.ko //加载进内核
这个模块是被应用程序所调用
如果知识点有出入还望前辈们指出,有和我一样刚入门驱动的伙计,可以一起学习探讨