OK335XS-II移植U-boot2007.01学习笔记

    1158072.jpg

       从事嵌入式硬件工作以来,一直想学习Linux移植,提高自身能力,在今年终于付出行动了,买了一块OK335XS-II开发板学习,学习Linux的第一步是U-boot移植,由于开发板的U-boot不开源,只能一点一点摸索了。从官网下载了ti-processor-sdk-linux-am335x-evm-04.03.00.05-Linux-x86-Install,安装后里面的U-boot是2017.01版本,于是就决定从2017.01开始学起,在遇到困难的时候,可以参考下官方的代码。

        从 ftp://ftp.denx.de/pub/u-boot/  下载U-boot2017.01源码后,在Linux环境下将其解压,就能看到U-boot目录结构和源码了,我们不会从0开始去写一个单板源码,而是从相似的源码里面去修改。在u-boot-2017.01\board\ti目录下,有ti官方各类开发板的源码,我们的移植就是从这里的源码修改。步骤如下:

一、构建开发板框架

1、在board目录下,新建厂商和开发板目录:board\forlinx\ok335x,然后复制board\ti\am335x目录下的所有文件到board\forlinx\ok335x目录下;

2、复制u-boot-2017.01\configs目录下的am335x_evm_defconfig,改名为ok335x_defconfig,放在u-boot-2017.01\configs目录下;

3、复制u-boot-2017.01\include\configs目录下的am335x_evm.h,改为名ok335x.h,放在u-boot-2017.01\include\configs目录下;

二、修改相关文件内容

1、修改ok335x_defconfig文件

CONFIG_TARGET_AM335X_EVM=y

CONFIG_DEFAULT_DEVICE_TREE="am335x-evm" 

CONFIG_OF_LIST="am335x-evm am335x-bone am335x-boneblack am335x-evmsk am335x-bonegreen am335x-icev2"

 修改后    

CONFIG_TARGET_OK335X=y

CONFIG_DEFAULT_DEVICE_TREE="ok335x

CONFIG_OF_LIST="ok335x"


2、修必Kconfig文件

1)修改board\forlinx\ok335x目录下的Kconfig

if TARGET_AM335X_EVM 

config SYS_BOARD

default "am335x"

config SYS_VENDOR

default "ti"

config SYS_CONFIG_NAME

default "am335x_evm"

source "board/ti/common/Kconfig"

修改后:

if TARGET_OK335X

config SYS_BOARD

default "ok335x"

config SYS_VENDOR

default "forlinx"

config SYS_CONFIG_NAME

default "ok335x"

source "board/ti/common/Kconfig"        这一行删除


2)board\forlinx\ok335x目录下的Kconfig文件修改完成后,还需要修改u-boot-2017.01\arch\arm下的Kconfig文件

按照格式增加以下内容

       config TARGET_OK335X

       bool "Support OK335X"

        select CPU_V7

        select SUPPORT_SPL

        select DM 

        select DM_SERIAL

        select DM_GPIO


source "board/forlinx/ok335x/Kconfig"


3、修改ok335x.h

#ifndef __CONFIG_AM335X_EVM_H

#define __CONFIG_AM335X_EVM_H

#define CONFIG_SYS_LDSCRIPT"board/ti/am335x/u-boot.lds"

"if test $board_name = A335BONE; then " \

"setenv fdtfile am335x-bone.dtb; fi; " \

修改后:

#ifndef __CONFIG_OK335X_H

#define __CONFIG_OK335X_H

#define CONFIG_SYS_LDSCRIPT"board/forlinx/ok335x/u-boot.lds"

"if test $board_name = OK335X; then " \

"setenv fdtfile ok335x.dtb; fi; " \


4、修改board.c

将ti关于开发板检测的代码都删掉:

#include "../common/board_detect.h"

#ifdef CONFIG_TI_I2C_BOARD_DETECT

void do_board_detect(void)

{

enable_i2c0_pin_mux();

i2c_init(CONFIG_SYS_OMAP24_I2C_SPEED, CONFIG_SYS_OMAP24_I2C_SLAVE);


if (ti_i2c_eeprom_am_get(-1, CONFIG_SYS_I2C_EEPROM_ADDR))

printf("ti_i2c_eeprom_init failed\n");

}

#endif


基于以上的修改,就可以编译了,但会有很多错误,然后再根据错误提示逐一排除。


5、打开U-boot调试模式

在u-boot目录下,打开include/common.h,修改如下:

#define DEBUG        //增加这一行

#ifdef DEBUG

#define _DEBUG1

#else

#define _DEBUG0

#endif


三、编译错误排除

1、lib/asm-offsets.c:1:0: error: bad value (armv5) for -march= switch

这是缺少交叉编译环境变量导致,先输入export的两条指令,再编译就可以了。

export CROSS_COMPILE=arm-linux-gnueabihf-

export ARCH=arm

make ok335x_defconfig

make


2、include/config.h:6:22: fatal error: configs/.h: No such file or directory

这是由于因为CONFIG_SYS_CONFIG_NAME为空,导致config.h文件生成错误,生成了一行错误的代码 #include "configs/.h"

解决办法:在对应的开发板目录下的Kconfig文件中增加以下内容就可以了。

       config TARGET_OK335X

       bool "Support OK335X"

        select CPU_V7

        select SUPPORT_SPL

        select DM 

        select DM_SERIAL

        select DM_GPIO


source "board/forlinx/ok335x/Kconfig"



0 条评论

目前没有人发表评论

发表评论

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。