您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 市场营销 > ZLG IMX280A - 五步曲之三:uboot2017.09移植(下篇)
五步曲之三:uboot2017.09移植(下篇)BY:johndingQQ:3433992081、获取ddr配置(由芯片实物确定芯片型号是ISSIIS43DR16320D-3DBLI,与原理图不一致)(根据ddr的手册与原理图修改MX28_DDR2_register_programming_aid手册(之前用的mddr的手册配置,导致系统起不来)表格中红色部分):芯片命名规则:16100:1*1632200:2*3216400:4*1616800:8*1632400:4*3216160:16*16csvMX28_DDR2_regis…1.xlsx101.25KB芯片信息表格信息:*上面需要准确填写的是行列地址总线宽度,bank数,CS数,数据总线宽度,时钟频率。*tFAW不小于tRRD4倍,所以设置40ns。*tRPA:如果数据手册不能找到tRPA,那么这么位置填入tRP。*CASLAT:设置CASLATCH周期,这个周期在ddr初始化时由ddr控制器对ddr设置。*根据信号线计算ram大小,如下2^(1cs+3bank+15row+12col+1datapathwidth)=4GB:2、下载源码与建立baseline:2.1源码下载略。2.2选择一个相近的平台,编写试编译通过:./setenv.shmakemx28evk_defconfigmakeu-boot.sb*这里的sb文件是加密文件,而elftosb工具生成的可以通过-z参数选择是否加密。*如果编译器是32位,但是系统是64位,那么安装32位兼容库即可:sudoaptinstalllibc6-dev-i386lib32z12.3复制文件与修改配置:cpconfigs/mx28evk_defconfigconfigs/imx280a_defconfigcpconfigs/mx28evk_defconfigconfigs/imx280a_mmc_defconfigmkdirboard/zlg/&&cp-rfboard/freescale/mx28evk/board/zlg/imx280a/mvboard/zlg/imx280a/mx28evk.cboard/zlg/imx280a/imx280a.cvimboard/zlg/imx280a/Kconfigvimboard/zlg/imx280a/Makefilecpinclude/configs/mx28evk.hinclude/configs/imx280a.hviminclude/configs/imx280a.h*vim./arch/arm/include/asm/mach-types.h*从mx28手册可以得到内存起始物理地址:*删掉FEC,USB,SPI,LCD及额外环境变量的配置。viminclude/configs/mxs.h*运行地址前面要预留一段内存,因为ubootmemmap如下:*上面的nand_base是nand控制器,也就是gpmi的基地址。*根据nand芯片手册可知地址周期为4。vim./arch/arm/Kconfigmakeimx280a_defconfigmakeARCH=armmenuconfig*这个可能会导致偶然启动失败问题。cp-r.configconfigs/imx280a_defconfigmakeimx280a_mmc_defconfigmakeARCH=armmenuconfigcp-r.configconfigs/imx280a_mmc_defconfig./build.shnand./build.shmmc*编译环境配置文件与编译脚本:catsetenv.sh#!/bin/bashexportARCH=armexportCROSS_COMPILE=arm-arm926ejs-linux-gnueabi-exportPATH=/home/john/x-tools/arm-arm926ejs-linux-gnueabi/bin:/home/john/study/imx280a/tools/linux_x86_64/:$PATHcatbuild.sh#!/bin/bashsource./setenv.shNUM_CPUS=$(cat/proc/cpuinfo|grep-cprocessor)if[$1=mmc];thenechobuildmmcubootmakeimx280a_mmc_defconfigelseechobuildnandubootmakeimx280a_defconfigfimake-j${NUM_CPUS}spl/u-boot-splmake-j${NUM_CPUS}u-bootelftosb-fimx28-carch/arm/cpu/arm926ejs/mxs/u-boot-imx28.bd-ou-boot.sbcp-rf./u-boot.sb/home/john/share/imx280/工具/烧写工具/cfimager/imx28_ivt_uboot.sb&&sync3、移植spl(bootload第一阶段)(spl大小不能超过60k,ocramapploadregion的大小):arch/arm/lib/vectors.S和arch/arm/lib/interrupts.c(提供中断向量表函数实体)arch/arm/cpu/arm926ejs/mxs/start.S和board/zlg/imx280a/iomux.c(提供board_init_ll函数)、arch/arm/cpu/arm926ejs/mxs/spl_boot.c(提供mxs_common_spl_init函数,在个函数里初始化电源,时钟,iomux,串口,内存等)*最后返回到bootrom中运行。3.1spl结构与存储关系:实际放在nand中的是sb文件,sb文件是elftosb利用bd配置文件生成的。*loadDCD就是加载DCD列表的romcommand序列,jump是告诉cpuimage的ivt在内存中的位置。*loadu_boot_spl表示sb第一个放u_boot_spl(除去sbheader,sectiontag与loadDCD外)。第二个放ivt,其中ivt入口地址是u_boot_spl的开始地址(加载地址),然后把ivt自己的加载地址置为0x8000。ivt在nand与ram的中的关系如下图一,habcall表示hab从0x8000这个ram地址读取ivt然后开始执行。ivt与habcall在nand中存储如下图二。图一:mx28不支持bootdata。而且dcd也不能用ivt的方式查找位置,必须通过romcommand的方式定位。另外不一定按照上面的方式分布,cpu能找到ivt就可以了。图二:0xd1002040是ivt的header。image加载地址由spl或uboot代码指定,如前面章节说明。3.2根据.lds文件分析spl的结构:vimarch/arm/cpu/arm926ejs/mxs/u-boot-spl.lds可知spl的入口文件为mxs下的./arch/arm/lib/vectors.S,其次是start.S。*start.S运行完成后,spl就会跳转回bootrom(xip执行),最后会跳转到uboot执行(在sdram初始化完成后,uboot的程序就已经在ram中了。可能是dma过去的)。*有些厂家的做法是将soc相关代码放在arch/arm/cpu/armxxx/xxx,现在大多数厂家都会放在arch/arm/mach-xxx。*正式uboot的连接文件在arch/arm/cpu/u-boot.lds。3.3修改mem初始化设置(.inc中黄色部分):vimboard/zlg/imx280a/iomux.cvim./arch/arm/cpu/arm926ejs/mxs/spl_mem_init.c3.4时钟系统修改:3.5电源系统修改:mx28处理器提供两种供电接口,三套供电方案:*采用电池供电,pswitch必须被申明。这样上电后dcdc才会开始工作。*采用电池单独供电,内部的供电需要采用dcdc供电,如下菊花链所示:*在第三种方案中,bootrom固件支持掉电切换功能。如下图所示:*cpu的LRADC可以测量电池电压,可以用来决定是否充电,切换电源或是关机。imx280a的供电方案是供电方式三。但是电池那路电源是由系统(usbotg接口或排插)转4.2v而来,还有一路来自外部usbotg或者排针。由于其他电路采用系统供电方式(系统转3.3v或直接使用系统电源),所以我们就把系统供电作为唯一供电方式(也就是类似于供电方式一)。也就是申明pswitch,关闭4.2v线性转换器,关闭充电功能(不关闭也可以,因为永远不可能有充电的情况),使用battery作为电源(spl中优先使用battery作为电源),并且按照如下连接方式设置dcdc输出。*DCDC_VDDD设置为1.5v输出。vimarch/arm/cpu/arm926ejs/mxs/spl_power_init.cvimarch/arm/cpu/arm926ejs/mxs/spl_mem_init.c3.6添加与修改调试串口,然后用sb_load工具(usb启动)灌入board看能不能运行。viminclude/common.hvimboard/zlg/imx280a/iomux.c*上面的iomuxtable是spl模式与正常模式共享的。*默认状态下duart连接是的pwm,所以需要先解决冲突,不然会出现输入无效的现象。vimarch/arm/cpu/arm926ejs/mxs/spl_boot.c*这里使用如下命令生成没经加密的image用于调试。vimarch/arm/cpu/arm926ejs/mxs/u-boot-imx28.bd./setenv.shmakeimx280a_defconfigmakespl/u-boot-splmakeu-bootelftosb-fimx28-carch/arm/cpu/arm926ejs/mxs/u-boot-imx28.bd-ou-boot.sb*如果spl都没有串口输出,或者很难定位问题,那么可以尝试用ads+jtag调试。3.7调试nand:vimboard/zlg/imx280a/iomux.c在uboot中使用命令验证nand(这里的sector大小就是block大小):然后通过设置与保存环境变量,然后重启查看nand是否读写正常:3.8调试mmc:vimboard/zlg/imx280a/iomux.c在uboot中使用命令验证mmc:然后通过设置与保存环境变量,然后重启查看mmc是否读写正常:*mmcuboot需要使用cfimager工具烧写到sd卡(选择从sd启动,还需要硬件工程师事先将sd卡的sd配置信息写入otp中,cfgimage工具默认分三个区,fat+固件区1(TA3格式)+固件区2(OPUS格式),我们把固件区1放uboot,固件区2放rootfs固件,fat分区放内核)。cfimager.exe-fuboot.sb-erootfs.bin-a-d盘符copyuImage盘符*nand启动所需的nand布局,下面的FCB表示固件查找表,DBBT是坏块表(这个可以用kobs-ng生成,这个程序会生成两个固件,用来冗余启动):*emmc/sdcard是mmc设备,udisk/harddisk是sd设备,nand是mtd设备(mtd字符设备或mtdblock设备)。他们的上面是分区-文件系统-文件。*可以使用如下指令在c方式下读取arm寄存器:4、移植uboot:arch/arm/lib/vectors.S和arch/arm/lib/interrupts.c(提供中断向量表函数实体)arch/arm/cpu/arm926ejs/start.S和arch/arm/cpu/arm926ejs/m
本文标题:ZLG IMX280A - 五步曲之三:uboot2017.09移植(下篇)
链接地址:https://www.777doc.com/doc-4488486 .html