针对正点原子的i.mx6ull (a7处理器)

官方的uboot编译、烧写和启动

启动后====先看看与自己的有哪些不一样,

根据的自己的板子进行修改

这个阶段基本上,就是在这官方的bsp包,,肯定支持最多开发板,我们只需建立相同的文件,修改等等,

最多就是基本的外设驱动: 串口 lcd 网络 外置的mmc或者sd

uboot与内核联系的重要的参数bootcmd和bootargs

## bootcmd环境变量,
#define CONFIG_BOOTCOMMAND \ 
        "run findfdt;" \ =============设备树文件
        "mmc dev ${mmcdev};" \ 
        "mmc dev ${mmcdev}; 
            if mmc rescan; then " \ //看看有没有sd卡和emmc存在

            "if run loadbootscript; then " \ //如果加载文件成功就运行bootscript
                "run bootscript; " \ 
            "else " \ 
                "if run loadimage; then " \ //加载不成功就把mmc中zImage到内存中
                    "run mmcboot; " \ 
                "else run netboot; " \ 
                "fi; " \ 
            "fi; " \ 
        "else run netboot; fi"

mmcboot

"mmcboot=echo Booting from mmc ...; " \ 

     "run mmcargs; " \ //用来设置bootargs

     "if test ${boot_fdt} = yes || test ${boot_fdt} = try; then " \ 
         "if run loadfdt; then " \ //加载evk.dtb到83000000处linux文件
             "bootz ${loadaddr} - ${fdt_addr}; " \ //bootz 80800000-83000000
         "else " \ 
             "if test ${boot_fdt} = try; then " \ 
                 "bootz; " \ 
             "else " \ 
                 "echo WARN: Cannot load the DT; " \ 
             "fi; " \ 
         "fi; " \ 
     "else " \ 
         "bootz; " \ 
    "fi;\0" \

//整个bootcmd的功能就是
emmc Dev 1
fatload mmc 1:1 0x80800000 zImage //加载文件zImage 到0x80800000处
fatload mmc 1:1 0x83000000 imx6ull-14x14-evk.dtb //读取设备树到0x83000000处
bootz 0x80800000 - 0x83000000

bootargs(mmcargs设置的)环境变量

作用就是保存着uboot传递给Linux内核的的参数

mmcargs=setenv bootargs console=uboot里读取emmc 1分区fat32里文件里的MAC地址_根文件系统{baudrate} root=${mmcroot}
也就是
mmcargs=setenv bootargs console= ttymxc0, 115200 root= /dev/mmcblk1p2 rootwait rw

  • //console
    原来设置linux终端,通过什么设备(串口ttymxc 还是lcd)和linux就行交互
  • //root
    root用来设置根文件系统的位置,root=dev/mmcblk1p2用于指明根文件系统存放在mmcblk1设备分区2中
    这里的/dev/mmcblk1表示EMMC,而/dev/mmcblk1p2表示EMMC的分区2
  • //rootfstype
    一般配置root一起使用,rootfdtype用于指定根文件系统类型
    如果根文件系统为ext 格式的话此选项无所谓。如果根文件系统是 yaffs、jffs 或 ubifs 的话就需要设置此选项

uboot启动linux系统

从emmc启动也就是:

将编译出来的 ”linux镜像文件zImage“ 和 ”设备树文件“保存在EMMC中===》uboot从EMMC中读取这两个文件并启动

》》》先要保证emmmc里面有这两个必要的文件。:
ls mmc 1:1 看看有没有文件

》》再设置uboot的环境变量 bootcmd 和 bootargs:
setenv bootargs ‘console=ttymxc0,115200 root=/dev/mmcblk1p2 rootwait rw’
setenv bootcmd ‘mmc dev 1;fatload mmc 1:1 80800000 zImage; fatload mmc 1:1 83000000 imx6ull-alientek-emmc.dtb; bootz 80800000 - 83000000;’
saveenv

》》》再直接boot就可以启动

从网络启动(目的为了调试)可以用nfs或者tftp

每次修改linux系统文件或者linux下的某个驱动以后都要将其烧写到EMMC中去测试,这样实在太麻烦了

》》》在ubuntu建立一个文件夹叫做tftp ,把zImage镜像文件(linux内核)和设备树文件 放进去

》》》设置环境变量bootcmd 和 bootargs
setenv bootargs ‘console=ttymxc0,115200 root=/dev/mmcblk1p2 rootwait rw’
setenv bootcmd ‘tftp 80800000 zImage; tftp 83000000 imx6ull-alientek-emmc.dtb; bootz 80800000 - 83000000’
saveenv

》》》boot

这样有个缺点下次启动的时候还是要远端传驱动文件,而不是像本地直接使用

uboot DDR初始化

裸机

imxdownload软件下载,会在bin文件头部添加IVT DCD数据

uboot

uboot编译生成的u-boot.imx
u-boot.imx已经包含了IVT DCD数据

需要用官方的工具找出需要校准的寄存器的值,比对board/freescale/mx6ull_alientek_emmc/imximage.cfg进行修改

//Read DQS Gating calibration           
setmem /32  0x021b083c =    0x0140013C  // MPDGCTRL0 PHY0
            
//Read calibration          
setmem /32  0x021b0848 =    0x40403036  // MPRDDLCTL PHY0
            
//Write calibration                                 
setmem /32  0x021b0850 =    0x4040322E  // MPWRDLCTL PHY0

总结

  • 不管是自己购买的开发板还是自己做的开发板,基本都需要参考半导体厂商的dmeo板(贵),
    半导体厂商会在他们的开发板上移植好uboot、linux kernel和sysytemfs等最终做好BSP包给用户。

这个时候我们可以在官方提供的BSP包的基础上添加我们自己的板子,====俗称移植

  • 我们不会原封不动的照抄半导体的demo板,有修改就必然会涉及到uboot下驱动的移植
  • 一般uboot中需要解决 串口 (交互)、 NAND、EMMC或SD卡 (用来保存启动文件)、 网络驱动(用来调试) 、屏幕驱动(交互),uboot的主要目的就是启动内核,所以不要考虑太多的外设驱动
  • 在uboot中添加自己的板子信息,根据实际的情况来修改uboot中的驱动