博客列表

U-Boot for AM335x (续) 使用tftp来load内核
发表于:2014-10-13 16:25:40 | 分类:U-Boot
浏览( ) | 评论( )

调试Linux Kernel的时候,如果是每次都使用SD卡拷贝新uImage,很明显不如直接使用串口或网口传输来的方便。使用串口kermit传输的速度有点慢,所以我使用了minicom+tftp的方式。第一步:安装tftpyum install tftp第二步:修改/etc/xinetd.dservice tftp{        socket_type             = dgram        protocol                = udp        wait    &

U-Boot for AM335x (13) steps of building Linux Kernel
发表于:2014-09-02 15:45:18 | 分类:U-Boot
浏览( ) | 评论( )

U-Boot for AM335x (13) steps of building Linux Kernel 这一节我记录了porting Linux Kernel的具体步骤,和以往相差比较大的是driver的DT策略,内核不再将描述driver的代码放置在uImage中了,而是放在*.dtb文件里面,由u-boot.img传递给内核。具体的步骤见下(绝对路径、名字神马的,替换成自己的就行):====> STEP 1: 安装交叉工具链,它和编译U-Boot的是同一个,Forlinx光盘里面有提供:arm-arago-linux-gnueabi也可以在TI的官方网站下载,还可以使用GCC的mainline编译(使用GCC源码编译自己的工具链,也是非常interesting的事情,ps:开源软件说的interesting,就是非常有挑战性的意思,就是可能会让你想咔咔咔砸掉电脑的意思。。。)http://software-dl.ti.com/sitara_linux/esd/AM335xSDK/latest/index_FDS.html这是TI的官方开发软件的地址,下载这个东东,它里面神马都有:ti-sdk-a

U-Boot for AM335x (12) Linux kernel下关于ARM的DT
发表于:2014-09-02 15:40:02 | 分类:U-Boot
浏览( ) | 评论( )

U-Boot for AM335x (12) Linux kernel下关于ARM的DT之前解压内核的时候,到一半会被卡住,提示信息:Kernel panic - not syncing: No init found.  Try passing init= option to kernel. See Linux Documentation/init.txt for guidance.在网上找答案,发现这个错误与文件系统相关。于是将Forlinx编译好的内核和文件系统放到SD卡上(放置文件系统的时间比较长,使用Disks工具观察它确实不busy了之后再umount),重新上电启动,发现Linux Kernel正常解压,文件系统和液晶屏也能正常工作。哦耶~~~so,U-Boot的调试可以告一段落了,接下来是编译自己的Linux内核,以及编译自己的文件系统。懒得再想新的题目,so,这些部分也会放在《U-Boot for AM335x》系列里面。另外,要portingU-Boot,除了官方手册之外,TI官网提供的这篇文章也相当有帮助:http://processors.wiki.ti.com/index.p

U-Boot for AM335x (11) U-Boot中eth驱动
发表于:2014-08-28 15:56:24 | 分类:U-Boot
浏览( ) | 评论( )

U-Boot for AM335x (11) U-Boot中eth驱动在调试eth驱动之前,先把下面这个函数整理一下:int board_late_init(void)它的主要作用是,为U-Boot添加两个环境变量,名为board_name和board_rev,它们和AM335x的评估板版本有关,因为我只需要对Forlinx的OK335D单板进行porting,所以将里面的内容全部删除,直接返回0。当然,为了调试U-Boot,而不是自动解压Linux kernel,需要把前面的uEnv.txt文件从SD卡中删除。驱动eth的第一步,是定义GPIO的引脚mux:static struct module_pin_mux rgmii1_pin_mux[] = {        {OFFSET(mii1_txen), MODE(2)},                  

U-Boot for AM335x (10) u-boot.img如何驱动SD卡
发表于:2014-08-28 15:54:05 | 分类:U-Boot
浏览( ) | 评论( )

U-Boot for AM335x (10) u-boot.img如何驱动SD卡调试SPL的阶段貌似进行得非常顺利,主要是它的功能并不多,除了初始化GPIO、UART0、PMIC、DRAM之外,还有就是把u-boot.img搬进DRAM运行。在这个阶段里面,MMC(SD卡)是被自动识别的,用户不需要任何设置,MLO就会被从SD卡中读取到内部的DRAM中运行,然后才有后续的一系列操作。SPL里面初始化SD卡的代码在:arch/arm/cpu/armv7/omap-common/boot-common.c函数名是:int board_mmc_init(bd_t *bis);int omap_mmc_init(int dev_index, uint host_caps_mask, uint f_max, int cd_gpio,                int wp_gpio);在u-boot.img运行的时候,也会使用SPL里面初始化的MMC,默认就可以读取数

U-Boot for AM335x (9) u-boot.img的运行
发表于:2014-08-27 14:57:39 | 分类:U-Boot
浏览( ) | 评论( )

U-Boot for AM335x (9) u-boot.img的运行当u-boot.img在SDRAM中运行后,它从board_init_f开始,执行一系列初始化动作,它的位置在:arch/arm/lib/board.c包含语句:for (init_fnc_ptr = init_sequence; *init_fnc_ptr; ++init_fnc_ptr) {        if ((*init_fnc_ptr)() != 0) {                hang ();        }}init_sequence是函数指针数组,它包含了各种各样的初始化动作,timer、serial、console、i2c、dram等等:init_fnc_t *init_sequence[]数组元素之init_func_i2c

U-Boot for AM335x (8) spl如何调用u-boot.img
发表于:2014-08-27 14:53:14 | 分类:U-Boot
浏览( ) | 评论( )

U-Boot for AM335x (8) spl如何调用u-boot.imgam335x的mainline里面,有一个EEPROM,spl会使用I2C协议,读取存储在EEPROM里面的配置header,然后根据这个header来进行之后的操作。header是出厂的时候由厂家外部写入的,Forlinx的OK335xD板虽然也配有EEPROM芯片,但是里面的内容是空的。因此使用mainline来调试OK335xD板的时候,需要将有关EEPROM的内容去掉,将实际的硬件内容替换进入。根据自己的硬件修改SPL,相对来说并不复杂。因为u-boot的mainline里面基本上包含了所有主流硬件的参数,只需传递和自己的硬件对应的就行,比如DDR时钟频率,PMIC的型号和输出,以及GPIO的MUX外设配置初始化等等。到使用I2C0、设置PMIC都是比较简单的,真正麻烦的地方在于spl结束的时候读取u-boot.img。在前面的(6)spl中已经简单的提到了启动流程,而读取u-boot.img的关键在于common/spl/spl.c中的board_init_r函数:void board_init_r(gd_t *dummy

U-Boot for AM335x (7) 使用kermit
发表于:2014-08-27 14:50:56 | 分类:U-Boot
浏览( ) | 评论( )

U-Boot for AM335x (7) 使用kermit虽然我是minicom的忠实用户,但是调试U-Boot转向了kermit,因为前者的文件传输协议在这里有点问题。kermit也是开源软件,使用方法和minicom有点不同,但也是很好掌握的:===========================================http://www.denx.de/wiki/view/DULG/SystemSetup#Section_4.3.===========================================kermit executes the commands in its initialization file, .kermrc, in your home directory before it executes any other commands, so this can be easily used to customize its behaviour using appropriate initialization commands. The following sett

U-Boot for AM335x (6) functions of spl
发表于:2014-07-08 11:32:09 | 分类:U-Boot
浏览( ) | 评论( )

“How to control GPIO"的调试学习都是在SPL中进行的,它运行在u-boot.img之前,做一些更加基础的工作,而实际的u-boot命令行提示符不会在这里出现。之所以有SPL,和ARM的硬件结构是有关系的。因为u-boot.img通常体积不会很小,所以需要SPL先承担一部分基础的工作,除了时钟、PMIC之外,还需要初始化外部的SDRAM,这样才能把u-boot.img放到更大的外部SDRAM中运行。而SPL自身也是使用C语言写的,也需要stack才能运行,所以把它放在系统的内部小SRAM中。=================================source README=================================The implementation of U-Boot is complicated by the fact that U-Boot starts running out of ROM (flash memory), usually without access to system RAM (because the memor

U-Boot for AM335x (5) How to control GPIO
发表于:2014-07-07 15:24:32 | 分类:U-Boot
浏览( ) | 评论( )

最近迷上了一支名叫Bon Jovi美国乐队,很喜欢其中的一首歌《Bed of Roses》。理想中的生活就应该是听听歌,谈谈爱,梦想着被laid down in a bed of roses,可惜实际的生活却是被U-Boot像冰山一样的代码彻底撩倒。调试U-Boot和Linux内核,成就感总是来得极其不容易。s_init()是一个比较关键的函数,它完成启动时的很多功能,包括时钟设置、串口设置等等。它会调用preloader_console_init()函数,此时串口信息才开始打印。之后会调用set_mux_conf_regs()函数,将GPIO口设置为相应的外设功能,此处根据自己的电路板作相应的修改。如果要在U-Boot中新增加一个GPIO口,那么需要以下几个步骤:1.定义struct module_pin_mux结构体,以GPIO3_8为例:static struct module_pin_mux gpio3_8_pin_mux[] = {        {OFFSET(emu1), (MODE(7))},  &nbs