一、前言
uboot启动后,一些外设如DDR、EMMC、网口、串口、音频、显示等等已经被初始化,为什么Linux内核中还需要写Linux驱动呢?
二、uboot驱动和Linux驱动的区别
1、直观理解
驱动,不仅仅是为了初始化,还实现了一组接口(read、write、open、close)供用户态应用程序使用。
光初始化有啥用,就像你开车一样,发动机发动了,前灯亮了,如此而已。驱动不会自己执行,驱动都是被动被程序调用。就像车不会自己跑一样,需要司机(应用程序)通过车(驱动)提供的接口,去行驶、倒车、关窗、关闭打开车灯。
来自:https://www.zhihu.com/question/534378582/answer/2500296995
2、专业理解
uboot本质就是个裸板程序,对于裸板程序来说:
第一只能单任务执行,用户需求要多任务;
第二,开发起来极其繁琐,比如IIC,各种时序写完程序员要花很多时间加班加点赶进程最后还是比竞争对手慢;
第三,直接操作物理地址,极其不安全。
因此uboot我们要把他设计成这样的特性:
功能上只做一些必要的硬件初始化(根据用户需求),和启动linux内核,并为linux提供根文件系统的启动参数。生命周期上linux一旦启动,uboot就死亡,所有内存由linux掌控。
来自:https://www.zhihu.com/question/534378582/answer/2502620899
三、uboot为什么要有驱动
我们都知道uboot主要作用就是启动Linux内核,那为什么需要再uboot中添加硬件的驱动呢?等到内核启动之后再添加Linux驱动到内核不就可以了吗?
uboot提供网络的功能,可以方便后续调试。比如,nfs文件系统,tftp下载等。当然,如果不想用这个网络驱动也可以,但是,这样就少了一些调试途径了。 现在的开发板,有些也可以通过OTG USB下载,下载文件系统的,不需要网线可以的。
比如移植网络驱动,uboot阶段可以通过网络下载,更新linux kernel,rootfs等。
在内核出现故障时,可以使用uboot的nfs文件系统、tftp下载等功能修复。