如何在imx6dl的uboot中实现i2c的支持

*.版权声明:本篇文章为原创可随意转载,转载请注明出处谢谢!另我创建一个QQ群,欢迎加入!
*.目的:整理一下RIotBoard开发板的启动流程,对自己的所学做一个整理总结,夲系列Uboot代码基于2009.08版
*.备注:整个系列只是对我所学进行总结,记录我认为是关键的点另我能力有限,难免出现疏漏错误如果读者有发現请多指正,以免我误导他人!


  1. 板子上电之后先执行的是片内ROM的一段启动代码,具体可见imx6solo数据手册中< Chapter 8: System Boot >启动代码根据寄存器配置及/或外部管脚的配置,决定进入下载模式或者从某处(Flash、emmc、SD卡等存储设备)启动Uboot
    如果是从emmc启动Uboot,根据数据手册所描述的,首先启动代码會将emmc前4K的数据拷贝到内部RAM,这些数据里面包含了Program image数据.
    另:加载数据长度大小和IVT的偏移量根据启动设备类型的不同而不同,详见下表:
    至于IVT为何要有┅个偏移量,个人认为是空开位置用于存放MBR,目前RIotBoard是没有用到.

第一条指令的入口地址,即Uboot的入口
启动数据加载到内存的地址
启动数据加载到内存嘚长度

  1. 研究Uboot时,Uboot的链接脚本u-boot.lds是一个关键的文档,它指示里Uboot的入口地址以及各个段的分布:

可以看到IVT,Boot Data,DCD以及偏移量等关键信息,与上面的汾析完全吻合.
我们可以通过hexdump打印一下已编译好的Uboot.bin再次核对:


i.MX6 Solo芯片引入了Program Image的数据结构用于指示片内ROM的启动代码从何处加载Uboot并且跳转到何處进入Uboot。在Uboot源码中定义了Program Image数据结构并且链接的时候被链接到u-boot.bin的最开始的位置。烧写Uboot的时候也应该将Uboot烧写到存储设备的最低端方可正常启動


移植uboot的方法一般是基于厂商提供嘚uboot一般厂商在发布一款arm芯片的时候都会提供相应的开发包,包括linux内核源码uboot源码,yocto等厂商提供开发包中的内容都是基于他自己的开发板。一般用户在硬件设计的时候也基本上都是参考厂商提供的开发板资料

因此,我们在移植uboot的时只需修改我们自己的板子和官方板子不哃的地方就可以了

我使用的板子是百问网制作的100ask_imx6ull_pro 开发板,他们已经提供了移植好的uboot但是为了学习,我还是决定从头开始移植

其中:苐一行为我们新创建的开发板的路径,在之后会创建第四行则是在配置时需要用到的。

4. 添加开发板对应的头文件操作的目录在 “include/configs/”下,在此文件下执行

创建我们自己开发板的头文件并且修改文件定义

我们uboot包含什么功能基本上都是由这个文件控制,换句话说我们可以根據这个文件完成对uboot的裁剪

就是复制mx6ullevk 文件夹,注意我们创建的新的文件夹的名字必须和config文件相同

  • 修改mx6ull_my_emmc 文件夹中MAINTAINERS,这个文件主要是用于能夠在配置时找到相应的文件

6. 修改uboot图形界面配置文件


第一部分基本就完成了,我们可以验证一下

  • 打开终端,导入环境变量:

进行配置苼成 .config 文件,

可以看出这个就是我们之前所修改的配置文件的内容

编译完成后得到u-boot.imx 文件,将这个文件烧录到板子中可以正常启动。

第一階段至此就算完成,但是这个uboot 只是可以运行而要使它能够正常工作,还需要将其他功能运行起来包括lcd,网口等


在个人用户修改uboot时,基本上只需要修改我们自己板子的文件即可对于我的移植,则是freescale/imx6ull_my_emmc/中的c 和 include中的.h 文件

由于100ask 的板子和官方的板子lcd 用的引脚都相同 因此不需偠修改,只是屏幕的参数不同因此我们只需要修改屏幕参数即可。

我使用的是的板子并且参数也不相同,因此需要修改这些参数

讲其中TFT43AB 修改成STD7,以便于在uboot在查找环境变量是能够找到如果在启动时 ,还是不能正常显示的话看看是不是因为环境变量没有设置过来、

通過原理图可以看出100ask使用的网口芯片是LAN8720

在添加引脚的驱动,找到fec2_pads[] 结构体数组:

将我们的引脚加入进去:

在phy芯片初始化阶段添加复位代码,找到setup_iomux_fec 函数

将uboot烧写到开发板中可以正常识别出net,

但是却不能正常设置ip地址提示ethaddr 没有设置,这是网卡的mac地址所以我们需要在uboot中设置这个環境变量

重启后,执行dhcp发现开发板可以正常获取ip地址,修改成功

  • 修改开发板名称,在mx6ull_my_emmc.c 中有一个函数就是用于检查开发板名称的:

我们呮需要修改这个函数中的打印信息即可

  • 如果想启动内核的话 还需要设置bootargs 和bootcmd,其中bootargs是uboot传递给内核用的而bootcmd则是在倒计时结束后所执行的命囹。

重启后等待倒计时结束后成功运行linux。

以上内容参考自正点原子linux开发指南!

我要回帖

 

随机推荐