Uboot的裁剪和移植——基于IMX6ULL

Uboot的裁剪是裁剪什么?

        Uboot的裁剪分为两个方面:Uboot本身命令的裁剪具体SoC硬件配置的裁剪

        Uboot本身命令的裁剪:Uboot提供了很多的操作命令,我们使用Uboot的时候通常只使用最常用的一些命令,其他很多的命令有时候用不上,这个时候我们可以在SoC的头文件中进行Uboot命令的使能或者禁止,对IMX6ULL的Uboot来说,这个文件的路径为:uboot/include/configs/mx6ullxxx.h(这个.h文件的名字可以根据自己的板子来进行随意设置)。其中和Uboot命令相关的选择都是通过宏定义的,如下:

#define CONFIG_CMD_MEMTEST
#ifdef CONFIG_CMD_NET
#define CONFIG_CMD_PING
#define CONFIG_CMD_DHCP
#define CONFIG_CMD_MII
....

        可以看到,Uboot命令本身的宏定义其中都包含了CMD字段,如果需要该命令就宏定义出来,如果不需要,希望禁用该命令,直接注释掉即可。通常如果希望编译出来的Uboot的大小尽量小的话,可以只使能必要的命令,不需要的命令全部注释掉,这样在编译的时候这些不需要的命令的代码文件不会被编译进最后的Uboot文件中,可以减小最后的Uboot.bin的大小。

        Uboot中关于SoC硬件信息的裁剪:SoC厂商发布的Uboot是完美适配官方的评估板的,我们自己的板子上的硬件配置和官方的评估板是不同的,因此需要根据自己板子上的硬件信息来裁剪官方提供的Uboot。对SoC硬件信息进行配置同样是在uboot/include/configs/mx6ullxxx.h文件中进行的,硬件信息的配置选项如下所示:

//物理内存大小的设置,根据具体硬件进行配置
#ifdef CONFIG_TARGET_MX6ULL_9X9_EVK
#define PHYS_SDRAM_SIZE SZ_256M
#define CONFIG_BOOTARGS_CMA_SIZE "cma=96M "
#else
#define PHYS_SDRAM_SIZE SZ_512M
#define CONFIG_BOOTARGS_CMA_SIZE ""
#undef CONFIG_LDO_BYPASS_CHECK
#endif

//串口的使能和配置
#define CONFIG_MXC_UART
#define CONFIG_MXC_UART_BASE UART1_BASE

//I2C的使能和配置
#define CONFIG_CMD_I2C
#ifdef CONFIG_CMD_I2C
#define CONFIG_SYS_I2C
#define CONFIG_SYS_I2C_MXC
#define CONFIG_SYS_I2C_MXC_I2C1 /* enable I2C bus 1 */
#define CONFIG_SYS_I2C_MXC_I2C2 /* enable I2C bus 2 */
#define CONFIG_SYS_I2C_SPEED 100000

//DMA相关的配置,Boot阶段可以不使能DMA
#define CONFIG_APBH_DMA
#define CONFIG_APBH_DMA_BURST
#define CONFIG_APBH_DMA_BURST8

//DDR相关的配置
#define CONFIG_NR_DRAM_BANKS 1
#define PHYS_SDRAM MMDC0_ARB_BASE_ADDR
#define CONFIG_SYS_SDRAM_BASE PHYS_SDRAM
#define CONFIG_SYS_INIT_RAM_ADDR IRAM_BASE_ADDR
#define CONFIG_SYS_INIT_RAM_SIZE IRAM_SIZE

....

        如上,硬件的使能和禁用也是在该文件中通过宏进行配置的,我们在Boot阶段往往只需要使能必要的硬件(比如串口,网口,FLASH,LCD屏幕等),其余的硬件可以等待启动内核以后再启动。

        那么这个宏是如何控制硬件的使能和禁用的呢?

        以串口的宏:#define CONFIG_MXC_UART为例

        一、在.h文件中定义了这个宏以后,我们使用命令make xxx_defconfig对Uboot进行配置以后,在Uboot的顶层目录下生成的.config文件中会出现这样一句:CONFIG_MXC_UART=y,

        二、使用make命令,顶层的make命令会调用各个子目录下的Makefile文件,在串口的目录下的Makefile文件(路径uboot/driver/serial/Makefile)中有这么一句:obj-$(CONFIG_MXC_UART)+=serial_mxc.o,由于在第一句中.config中这个宏=y,所以Makefile的目标obj-y会追加这个串口驱动的目标文件,这个目标文件就是由串口的去文件serial_mxc.c文件编译链接生成的。

        三、经过上述的过程,串口的驱动程序就被添加到了最后的uboot.bin文件中,也就是使能了该硬件。

实际Uboot的剪裁移植的流程是怎样的(以IMX6ULL为例)?

        一、我们知道使用Uboot之前首先要配置Uboot,先配置,再make,那么这里就需要一个配置文件,官方提供的uboot的配置文件是基于其评估板的,所以我们要根据自己的开发板创建我们自己的配置文件,这个配置文件的目录是uboot/configs,文件夹中有非常多的配置文件,我们在其中创建自己的配置文件。这个配置文件不需要我们从头开始写,通常都是直接复制官方评估板的配置文件,然后根据我们自己的需求进行配置。

        二、添加开发板的头文件,这一步很重要,Uboot的裁剪移植基本都是在这个头文件中进行的,开发板头文件的目录是uboot/include/configs下。同样,这个头文件也不需要我们从头写,也是复制官方评估板的配置文件,然后根据我们自己的开发板进行修改,具体修改什么,上述已经说了,就是两大块,Uboot本身的命令使能和禁止以及硬件的使能与禁止。

        三、添加自己开发板的板级文件夹,在uboot/board目录下有非常多的SoC厂商的文件夹,每个文件夹下又包含了该厂商发布的各种SoC的文件夹,也就是说每种SoC都配有自己的一个文件夹。我们使用IMX6ULL这款SoC,我们就在uboot/board/freescale目录下创建我们自己板子的文件夹。同样,这个文件夹也是复制官方开发板的文件夹,这个文件夹中有一些文件,其中最重要的两个文件就是Makefile文件和板子的.c文件,Makefile文件控制着.c文件的编译。

        四、要修改驱动程序,主要是修改板级文件夹下的开发板的.c文件,这时候Linux内核还没有加载,此时运行的就是裸机程序,所以硬件的引脚相关信息都是写在c文件中的,所以我们按照自己的硬件信息来修改(重点就是在.c文件中修改相关外设的引脚信息,引脚的复用属性和电气属性)。一般需要修改的就是LCD的参数信息,网卡的引脚配置等。因为LCD的引脚和官方评估板的LCD引脚一般都设计为相同的,所以LCD通常只需要修改LCD的参数信息。而网卡我们自己设计的板子和官方的评估板的引脚可能不同,所以需要修改引脚的信息,然后是引脚的复用状态和电气状态,一般网卡厂商都提供了网卡的驱动程序,只需要在板子的.h文件中使能该厂商的网卡驱动即可,有时候也需要修改厂商的驱动程序,修改驱动程序就是像操作单片机的寄存器这样配置该外设。

        、make xxx_defconfig ——>make ,得到最终的uboot.bin文件。

你可能感兴趣的:(linux,驱动开发,arm开发)