AM335x(TQ335x)学习笔记——u-boot-2014.10移植

发布者:温雅如风最新更新时间:2015-08-19 来源: eefocus关键字:AM335x  TQ335x  u-boot 手机看文章 扫描二维码
随时随地手机看文章
最近移植了下u-boot-2014.10到TQ335x,如果基于am335x evm进行移植,需要修改的地方并不多。

由于TI的am335x evm开发使用了一个eeprom保存了板载配置信息,用来区分不同板子的型号的,而TQ335x没有这个eeprom,因此,需要修改eeprom相关的部分,使u-boot适应TQ335x开发板。

使用source insight查看代码,很容易发现,所有获取板载配置的部分都是通过读取eeprom获得的,因此,首选修改read_eeprom(board/ti/am335x/board.c)函数,具体的修改如下:

  1. static int read_eeprom(struct am335x_baseboard_id *header)  
  2. {  
  3. #if 1  
  4.     strcpy(header->name, "TQ335x");  
  5. #else  
  6.     /* Check if baseboard eeprom is available */  
  7.     if (i2c_probe(CONFIG_SYS_I2C_EEPROM_ADDR)) {  
  8.         puts("Could not probe the EEPROM; something fundamentally "  
  9.             "wrong on the I2C bus. ");  
  10.         return -ENODEV;  
  11.     }  
  12.   
  13.     /* read the eeprom using i2c */  
  14.     if (i2c_read(CONFIG_SYS_I2C_EEPROM_ADDR, 0, 2, (uchar *)header,  
  15.              sizeof(struct am335x_baseboard_id))) {  
  16.         puts("Could not read the EEPROM; something fundamentally"  
  17.             " wrong on the I2C bus. ");  
  18.         return -EIO;  
  19.     }  
  20.   
  21.     if (header->magic != 0xEE3355AA) {  
  22.         /* 
  23.          * read the eeprom using i2c again, 
  24.          * but use only a 1 byte address 
  25.          */  
  26.         if (i2c_read(CONFIG_SYS_I2C_EEPROM_ADDR, 0, 1, (uchar *)header,  
  27.                  sizeof(struct am335x_baseboard_id))) {  
  28.             puts("Could not read the EEPROM; something "  
  29.                 "fundamentally wrong on the I2C bus. ");  
  30.             return -EIO;  
  31.         }  
  32.   
  33.         if (header->magic != 0xEE3355AA) {  
  34.             printf("Incorrect magic number (0x%x) in EEPROM ",  
  35.                     header->magic);  
  36.             return -EINVAL;  
  37.         }  
  38.     }  
  39. #endif  
  40.   
  41.     return 0;  
  42. }  
通过上述修改,u-boot不去读取eeprom,而是直接将header的name赋值为"TQ335x",后面可以根据这一配置区分是否为TQ335x开发板。

 

然后是修改get_dpll_ddr_params(board/ti/am335x/board.c)函数,具体的修改内容如下:

  1. const struct dpll_params *get_dpll_ddr_params(void)  
  2. {  
  3.     struct am335x_baseboard_id header;  
  4.   
  5.     enable_i2c0_pin_mux();  
  6.     i2c_init(CONFIG_SYS_OMAP24_I2C_SPEED, CONFIG_SYS_OMAP24_I2C_SLAVE);  
  7.     if (read_eeprom(&header) < 0)  
  8.         puts("Could not get board ID. ");  
  9.   
  10.     if (board_is_tq335x(&header) || board_is_evm_sk(&header))  
  11.         return &dpll_ddr_evm_sk;  
  12.     else if (board_is_bone_lt(&header))  
  13.         return &dpll_ddr_bone_black;  
  14.     else if (board_is_evm_15_or_later(&header))  
  15.         return &dpll_ddr_evm_sk;  
  16.     else  
  17.         return &dpll_ddr;  
  18. }  
然后是修改sdram_init(board/ti/am335x/board.c)函数,具体的修改内容如下:
  1. void sdram_init(void)  
  2. {  
  3.     __maybe_unused struct am335x_baseboard_id header;  
  4.   
  5.     if (read_eeprom(&header) < 0)  
  6.         puts("Could not get board ID. ");  
  7.   
  8.     if (board_is_evm_sk(&header)) {  
  9.         /* 
  10.          * EVM SK 1.2A and later use gpio0_7 to enable DDR3. 
  11.          * This is safe enough to do on older revs. 
  12.          */  
  13.         gpio_request(GPIO_DDR_VTT_EN, "ddr_vtt_en");  
  14.         gpio_direction_output(GPIO_DDR_VTT_EN, 1);  
  15.     }  
  16.   
  17.     if (board_is_evm_sk(&header) || board_is_tq335x(&header))  
  18.         config_ddr(303, &ioregs_evmsk, &ddr3_data,  
  19.                &ddr3_cmd_ctrl_data, &ddr3_emif_reg_data, 0);  
  20.     else if (board_is_bone_lt(&header))  
  21.         config_ddr(400, &ioregs_bonelt,  
  22.                &ddr3_beagleblack_data,  
  23.                &ddr3_beagleblack_cmd_ctrl_data,  
  24.                &ddr3_beagleblack_emif_reg_data, 0);  
  25.     else if (board_is_evm_15_or_later(&header))  
  26.         config_ddr(303, &ioregs_evm15, &ddr3_evm_data,  
  27.                &ddr3_evm_cmd_ctrl_data, &ddr3_evm_emif_reg_data, 0);  
  28.     else  
  29.         config_ddr(266, &ioregs, &ddr2_data,  
  30.                &ddr2_cmd_ctrl_data, &ddr2_emif_reg_data, 0);  
  31. }  [page]
然后添加board_is_tq335x函数的具体实现,参考其它类似函数实现即可,由于我们的read_eeprom仅读到了name,其内容是"TQ335x",故可如下实现,在board/ti/am335x/board.h中添加如下内容:
  1. static inline int board_is_tq335x(struct am335x_baseboard_id *header)  
  2. {  
  3.     return !strncmp(header->name, "TQ335x", HDR_NAME_LEN);  
  4. }  
最后是修改enable_board_pin_mux(board/ti/am335x/mux.c)函数,具体的修改内容如下:
  1. void enable_board_pin_mux(struct am335x_baseboard_id *header)  
  2. {  
  3.     /* Do board-specific muxes. */  
  4.     if (board_is_bone(header) || board_is_tq335x(header)) {  
  5.         /* Beaglebone pinmux */  
  6.         configure_module_pin_mux(i2c1_pin_mux);  
  7.         configure_module_pin_mux(mii1_pin_mux);  
  8.         configure_module_pin_mux(mmc0_pin_mux);  
  9. #if defined(CONFIG_NAND)  
  10.         configure_module_pin_mux(nand_pin_mux);  
  11. #elif defined(CONFIG_NOR)  
  12.         configure_module_pin_mux(bone_norcape_pin_mux);  
  13. #else  
  14.         configure_module_pin_mux(mmc1_pin_mux);  
  15. #endif  
  16.     } else if (board_is_gp_evm(header)) {  
  17.         /* General Purpose EVM */  
  18.         unsigned short profile = detect_daughter_board_profile();  
  19.         configure_module_pin_mux(rgmii1_pin_mux);  
  20.         configure_module_pin_mux(mmc0_pin_mux);  
  21.         /* In profile #2 i2c1 and spi0 conflict. */  
  22.         if (profile & ~PROFILE_2)  
  23.             configure_module_pin_mux(i2c1_pin_mux);  
  24.         /* Profiles 2 & 3 don't have NAND */  
  25. #ifdef CONFIG_NAND  
  26.         if (profile & ~(PROFILE_2 | PROFILE_3))  
  27.             configure_module_pin_mux(nand_pin_mux);  
  28. #endif  
  29.         else if (profile == PROFILE_2) {  
  30.             configure_module_pin_mux(mmc1_pin_mux);  
  31.             configure_module_pin_mux(spi0_pin_mux);  
  32.         }  
  33.     } else if (board_is_idk(header)) {  
  34.         /* Industrial Motor Control (IDK) */  
  35.         configure_module_pin_mux(mii1_pin_mux);  
  36.         configure_module_pin_mux(mmc0_no_cd_pin_mux);  
  37.     } else if (board_is_evm_sk(header)) {  
  38.         /* Starter Kit EVM */  
  39.         configure_module_pin_mux(i2c1_pin_mux);  
  40.         configure_module_pin_mux(gpio0_7_pin_mux);  
  41.         configure_module_pin_mux(rgmii1_pin_mux);  
  42.         configure_module_pin_mux(mmc0_pin_mux_sk_evm);  
  43.     } else if (board_is_bone_lt(header)) {  
  44.         /* Beaglebone LT pinmux */  
  45.         configure_module_pin_mux(i2c1_pin_mux);  
  46.         configure_module_pin_mux(mii1_pin_mux);  
  47.         configure_module_pin_mux(mmc0_pin_mux);  
  48. #if defined(CONFIG_NAND)  
  49.         configure_module_pin_mux(nand_pin_mux);  
  50. #elif defined(CONFIG_NOR)  
  51.         configure_module_pin_mux(bone_norcape_pin_mux);  
  52. #else  
  53.         configure_module_pin_mux(mmc1_pin_mux);  
  54. #endif  
  55.     } else {  
  56.         puts("Unknown board, cannot configure pinmux.");  
  57.         hang();  
  58.     }  
  59. }  

另外,这个版本的u-boot有个bug,需要修改fat_register_device(fs/fat/fat.c)函数:

  1. int fat_register_device(block_dev_desc_t *dev_desc, int part_no)  
  2. {  
  3.     disk_partition_t info;  
  4.   
  5.     /* First close any currently found FAT filesystem */  
  6.     cur_dev = NULL;  
  7.   
  8.     /* Read the partition table, if present */  
  9.     if (get_partition_info(dev_desc, part_no, &info)) {  
  10.         /*if (part_no != 0) { 
  11.             printf("** Partition %d not valid on device %d ** ", 
  12.                     part_no, dev_desc->dev); 
  13.             return -1; 
  14.         }*/  
  15.   
  16.         info.start = 0;  
  17.         info.size = dev_desc->lba;  
  18.         info.blksz = dev_desc->blksz;  
  19.         info.name[0] = 0;  
  20.         info.type[0] = 0;  
  21.         info.bootable = 0;  
  22. #ifdef CONFIG_PARTITION_UUIDS  
  23.         info.uuid[0] = 0;  
  24. #endif  
  25.     }  
  26.   
  27.     return fat_set_blk_dev(dev_desc, &info);  
  28. }  
至此,u-boot就已经可以启动了,但是有多余的步骤和log,不过可以去掉,修改file_fat_read_at(fs/fat/fat.c)函数:
  1. long file_fat_read_at(const char *filename, unsigned long pos, void *buffer,  
  2.               unsigned long maxsize)  
  3. {  
  4.     debug("reading %s ", filename);  
  5.     return do_fat_read_at(filename, pos, buffer, maxsize, LS_NO, 0);  
  6. }  
最后,TQ335x是MLO启动u-boot,然后u-boot去启动内核,故可以去掉配置项CONFIG_SPL_OS_BOOT,具体的修改文件include/configs/ti_armv7_common.h:
  1. #if defined(CONFIG_SPL_OS_BOOT_ENABLE)  
  2. #define CONFIG_SPL_OS_BOOT  
  3. #endif  

至此,u-boot的移植工作就完成了,编译方法如下:

  1. make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- am335x_evm_defconfig  
  2. make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- -j8  

其中,arm-linux-gnueabi-需要根据自己的交叉编译工具链前缀进行修改。完成u-boot的移植工作后我们来研究如何启动内核。

 

 

源码下载地址:

u-boot-2014.10 for TQ335x/TQ3358(SD卡启动)

关键字:AM335x  TQ335x  u-boot 引用地址:AM335x(TQ335x)学习笔记——u-boot-2014.10移植

上一篇:AM335x(TQ335x)学习笔记——使用dtb方式启动内核
下一篇:S5PV210(TQ210)学习笔记——Nand驱动之HWECC

推荐阅读最新更新时间:2024-03-16 14:29

基于S3C2440A的嵌入式U-BOOT千兆网络功能设计
U—BooT支持网络功能,在下载操作系统内核和大的文件系统时,比其它不支持网络的引导加载程序速度更快、更方便。目前U—BOOT仅支持10M/100M的网络功能,随着科学技术发展,千兆网络功能必将大量应用在嵌入式系统中。本文介绍了一种让U—BOOT支持千兆网络功能的方法,可以使U—BOOT功能更加强大,使用更加方便。 U—BOOT简介 U—BOOT的全称是Universal Boot Loader,它遵循GPL条款的开放源码项目,支持多种处理器,如ARM、PowerPC、MIPS等,也支持Linux、VxWorks、QNX、RTEMS、ARTOS、LynxOS等嵌入式操作系统。 U-BOOT包含两种不同的工作模式:启动加载模式和
[单片机]
基于S3C2440A的嵌入式<font color='red'>U-BOOT</font>千兆网络功能设计
移植u-boot-2010.09到S3C2440(二)——ARM汇编中的LDR及ADR的区别
我在看U-BOOT的lowlevel_init.S文件时看到以下代码: lowlevel_init: ldr r0, =SMRDATA ldr r1, _TEXT_BASE sub r0, r0, r1 ldr r1, =BWSCON add r2, r0, #13*4 0: ldr r3, , #4 str r3, , #4 cmp r2, r0 bne 0b mov pc, lr 这段代码实现了U-BOOT的内存控制器部分的寄存器初始化,一共13个寄存器,对U-BOOT来最重要的就是SDRAM的初始化,显然没有这部分代码,当U-BOOT从NAND FLASH中启动的时候,START.S文件是无法完成代码的relocate的
[单片机]
Windows下u-boot-2011.03在Mini2440移植详解(4)
增加Nand Flash的支持 参考网址: http://blog.csdn.net/zhaocj/article/details/6678866 http://blog.csdn.net/zhaocj/article/details/6709948 Nand flash的移植,网上说的很多。作者参考的是上面的两个网址,关于ECC的内容还没有校验。 网址http://my.oschina.net/fzliu/blog/33642,http://blog.chinaunix.net/uid-14833587-id-76512.html和http://blog.sina.com.cn/s/blog_640029b3
[单片机]
Windows下u-boot-2011.03在Mini2440移植详解(4)
U-boot 在 mini2440-S3C2440 上的移植(2)
1.本文主要讲解U-boot 在 mini2440-S3C2440 上的移植,用到的版本为 U-boot-2009.11_tekkaman-master,下载地址: https://download.csdn.net/download/jinanhezhuang/20823342?spm=1001.2014.3001.5501 1.下载官方u-boot:下载地址: 2.用xftp软件将压缩包上传到ubuntu; 3.解压安装包;tar命令 4.建立开发板文件: 我们将在smdk2410基础上移植,为了不破坏原本的代码,在board目录下将smdk2410复制到board下新建的文件夹tekkaman中的mini2440中;将m
[单片机]
<font color='red'>U-boot</font> 在 mini2440-S3C2440 上的移植(2)
U-Boot移植(18)网卡dm9000aep移植总结
总结: 主要修改三个文件: 1、/u-boot-1.1.6/include/configs/100ask24x0.h 2、/u-boot-1.1.6/board/100ask24x0/lowlevel_init.S 3、/u-boot-1.1.6/drivers/dm9000x.c 补充:4、/u-boot-1.1.6/drivers/dm9000x.h 把移植好的u-boot-1.1.6重新打成压缩包,便于收藏。 如下: tar cjf u-boot-1.1.6-new.tar.bz2 u-boot-1.1.6
[单片机]
基于S3C2410A的嵌入式系统的U-Boot移植
0 引 言 ARM嵌入式处理器已被广泛应用于消费电子产品、无线通信、网络通信和工业控制等领域。其中,ARM9的芯片更是以其低价格、低功耗、高性能在手持设备中占据着重要市场。在嵌入式操作系统中,Linux,Vxworks,WinCE三足鼎立,其中Linux由于其开源性、稳定性、安全性、可裁减性更是一支独放。在嵌入式系统中,如何实现在ARM9平台下Linux操作系统的引导工作是嵌入式技术开发的重要环节。 1 嵌入式系统的软件组成 1.1 系统的软件组成 嵌入式的软件系统主要由Bootloader、操作系统、文件系统、应用程序等组成。其中,Bootloader是介于硬件和操作系统之间的一层,其作用就好像PC机中的BIOS。系统加电运
[单片机]
基于S3C2410A的嵌入式系统的<font color='red'>U-Boot</font>移植
【嵌入式】从零开始移植U-boot到mini2440(二)——烧录篇
烧录 相关工具:j-link 软件:j-flash ARM V4.70 在编译成功之后,会生成u-boot.bin在output目录下,这个二进制文件就可以直接用于烧录。 烧录位置的确定方法 烧录的时候,我这里选择直接烧写在NOR中,看S3C2440的SPEC和开发板的原理图(找NOR的CE接口和S3C2440哪个引脚相连),当我们选择从NOR启动的时候,NOR Flash被映射到内存0x0000_0000 ~ 0x0800_0000,也就是说我们直接把bin文件烧录到0地址即可。 这里有一篇写的蛮好的blog,解释了ARM是如何通过NOR和NAND启动的。 https://www.cnblogs.com/aaron
[单片机]
【嵌入式】从零开始移植<font color='red'>U-boot</font>到mini2440(二)——烧录篇
Windows下u-boot-2011.03在Mini2440移植详解(3)
增加Nor Flash支持和增加DM9000支持 增加Nor Flash支持 参考网址:http://blog.csdn.net/l_backkom/article/details/6252410和《Mini2440之U-boot使用及移植详细手册2010-4-16》 修改该后串口输出如下: 显示2MiB。 relocaddr被修改成了0x33FB0000,和CONFIG_SYS_TEXT_BASE是一致的。reloc off为0,这个应该是copy前后的偏移。 @2014-03-31实验了一下在Nor下面saveenv,结果是失败,一直停留在Writing to Flash...上面,调试发现在u-boo
[单片机]
Windows下u-boot-2011.03在Mini2440移植详解(3)
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved