TI Davinci DM6441嵌入式Linux移植攻略——UBL移植篇

目录(?)[+]

  1. 一DM6441的Boot过程简介
  2. 二DM6441的UBL移植
    1. CCS文件夹
    2. Common文件夹
    3. GNU文件夹
      1. 移植DDR2
      2. 移植Nand Flash
      3. 其它

声明:本文参考网友zjb_integrated的文章《TI Davinci DM6446开发攻略——UBL移植》和《DAVINCI DM365-DM368开发攻略——U-BOOT-2010.12及UBL的移植》,内容有增删,特此声明!另有系列网文DM365的UBL源码分析》(作者不详)对UBL源码的分析比较透彻,有兴趣的也可以看看。

一、DM6441的Boot过程简介

在搭好 TI Davinci DM6441的开发环境后,今天起进入Linux的移植阶段。UBL的移植,相对于UBOOT移植、KERNEL移植、ROOTFS移植、设备驱动及DSP开发来说,还是比较简单的。先从DAVINCI的启动说起,了解UBL在DAVIN系统中的位置和作用。对于固件程序烧写在NAND FLASH 的Davinci dm644x嵌入式系统, 上电启动的过程如下:


RBL(ARM ROM Boot Loader)在芯片出厂的时候就已经烧写到ROM里了,这不需要大家关心。上电后,RBL会自动从EMIFA EM_CS2 memory space (0x0200 0000)执行指令,这个地址就是NAND FLASH 或NOR FLASH的片选起始地址。当你的系统设置为NAND BOOT的时候,UBL(User Boot Loader)是必不可少的,否则RBL不能直接把UBOOT给BOOT起来,因为RBL只支持14K NAND FLASH 的 BOOT程序,而UBOOT编译出来后的bin文件一般都大于80K,特别是版本越高,UBOOT的代码越大,所以这时候就需要写一个UBL。

UBL 从NAND FLASH 读取UBOOT,然后把UBOOT COPY 到 DDR2(RAM)的相关地址上,然后把UBOOT 给BOOT 起来。根据TI DAVIN RBL的规定,不同型号的NAND FLASH,UBL保存的地址是不同的,512字节PAGE 的NAND(即SMALL PAGE),保存的地址是:0x00004000;2048字节PAGE的NAND (即LARGE PAGE)保存的地址是:0x20000。

至于如何通过仿真器烧写UBL或通过UART BOOT烧写UBL,在U-BOOT移植的文章再详细介绍。

PS:不要混淆UBL和U-Boot!

二、DM6441的UBL移植

其实UBL和U-Boot的联系非常密切,放在这里单独来写,是因为本人也是个菜鸟,很多东西也不太懂,可以边写边加深理解。
nand-boot和nor-boot其实在移植的层面来看,都差不多。根据目标板的实际情况,重点放在nand-boot。这个UBL的版本是V1.50(当然你可以用更高的V2.00,导师提供给我的也是2.00的,但我的开发环境里是1.50的),在root/dvsdk_2_00_00_22/PSP_02_00_00_140/board_utilites/dm644x下(后面的U-Boot也在该目录),有个文件DM644x_FlashAndBootUtils_1_50.tar.gz,为了方便,把它复制到/home/usrname并解压出来:
host $ cp DM644x_FlashAndBootUtils_1_50.tar.gz /home/usrname
host $ tar zxvf DM644x_FlashAndBootUtils_1_50.tar.gz
host $ cd DM644x_FlashAndBootUtils_1_50
UBL就是在Common和DM644x下。
Common目录里有非常多东西,包括UBL的驱动源码、工具、脚本等等。我们主要关注arch,drivers,src,ubl,这几个文件夹打开看看就明白什么意思了。UBL的main()函数在/Common/ubl/src/ubl.c里。
DM644x下有CCS、Common,GNU三个文件夹:

CCS文件夹:

这里边的程序需要在TI CCS下编译,通过仿真器和JTAG在DM36X的板子上调试和烧写NAND FLASH或NOR FLASH,有烧写Writer的应用程序,用CCS打开工程文件,会连接到/dvsdk_2_00_00_22/PSP_02_00_00_140/board_utilites/Common/drivers里。暂且先不管。

Common文件夹:

Common里有核心的文件device.c和device_nand.c。device.c是最重要的文件,这里初始化很多系统的东西,见DEVICE_init():
1、屏蔽所有中断;
2、清除中断标志;
3、DEVICE_PSCInit(),Power and Sleep Controller;
4、DEVICE_pinmuxControl(),主芯片管脚复用的设置,DM644X的管脚复用很多,很复杂,一共5个PINMUX寄存器需配置;
5、DEVICE_PLL1Init(),PPL1配置,使用不同的频率的DM644x,这些值都不同,不过TI已经提供参数参考,DM6441一般使用Uint32 PLL1_Mult = 19;  // DSP=513 MHz
6、DEVICE_PLL2Init(),PPL2的配置,使用同上,不同频率的值不同;使用不同型号的DDR,要设置不同的参数,即时序参数等,这是关键的地方。
7、DEVICE_DDR2Init(),DDR2的配置,市场上不同的DDR2内存芯片需要不同的参数配置,就在这个函数内。
8、DEVICE_EMIFInit(),这个针对NAND FLASH接口或NOR FLASH接口的访问时序配置
9、DEVICE_UART0Init(),串口UART0的配置,这个就是我们调试DM644X串口的设置,我们使用UART0来调试LINUX,这里配置不好,后面的开发就无法调试了。
10、DEVICE_TIMER0Init(),定时器TIMER0的设置;
11、DEVICE_I2C0Init()的设置;

GNU文件夹:

这个就是在LINUX环境下编译UBL的环境,修改dvsdk_2_00_00_22/PSP_02_00_00_140/board_utilites/dm644x/GNU/ubl下的makefile,把与nor相关的命令全注释掉,只保留与nand相关的:
all:
$(MAKE) -C build TYPE=nand
# $(MAKE) -C build TYPE=nor
clean:
$(MAKE) -C build TYPE=nand clean
# $(MAKE) -C build TYPE=nor clean
%::
$(MAKE) -C build TYPE=nand $@
# $(MAKE) -C build TYPE=nor $@
然后是make clean和 make生成ubl_DM644x_nand.bin的文件。

另外,在其它目录还有一些重要的文件:
nand.c及nand.h (DM644x_FlashAndBootUtils_1_50/Common/drivers)
主要移植就是定义好UBOOT在NAND的存储地址,不同型号的NAND FLASH ,比如SMALL PAGE(512字节)和LARGE PAGE(2048字节)这些都要修改除非你的NAND的类型和TI EVM 兼容。
nandboot.c (DM644x_FlashAndBootUtils_1_50/Common/ubl/src)
主要任务就是如何把u-boot.bin或带有头的u-boot.img正确COPY到DDR里,这里最容易出问题,编译出来的U-BOOT文件一般带有Valid magic number(MAGIC_NUMBER_VALID),入口地址entrypaoit,这些信息不对都使UBOOT 运行不起来,建议看一下或COPY UBOOT的image.h。

好了,介绍到这里,我们已知道UBL的移植就是对device.c、device.h、device_nand.c、device_nand.h、nand.c、nand.h、nandboot.c及相应的makefile文件进行相应的修改。相信已可以根据自己目标板的实际情况进行相应移植了。下面正式开始对板子进行移植:
首先说下板子的配置:
CPU:DM6441
DDR2: 三星的K4T1G164QE-HCLE6,CL=3,16bit,8bank, PageSize=512word
Nand Flash:ST的NAND512-A,512Mbit容量,BusWidth=8,PageSize=512Bytes,BlockSize=16K
DDR2和Nand Flash都与Ti的评估板不一样,所以下面的重点是对DDR2和Nand Flash的移植。

1、移植DDR2

1)在device.c中第106至123行是对DDR2参数的配置,根据数据手册修改为:
    // For K4T1G164QE @ 162 MHz,modified by Dashon 2012.3.16
    static const Uint8 DDR_NM = 1;//16bit,modified by Dashon 2012.3.16
    static const Uint8 DDR_CL = 3;
    static const Uint8 DDR_IBANK = 3;
    static const Uint8 DDR_PAGESIZE = 1;//512,modified by Dashon 2012.3.16
    static const Uint8 DDR_T_RFC = 20;
    static const Uint8 DDR_T_RP = 2;
    static const Uint8 DDR_T_RCD = 2;
    static const Uint8 DDR_T_WR = 2;
    static const Uint8 DDR_T_RAS = 6;
    static const Uint8 DDR_T_RC = 8;
    static const Uint8 DDR_T_RRD = 2;
    static const Uint8 DDR_T_WTR = 1;
    static const Uint8 DDR_T_XSNR = 22;
    static const Uint8 DDR_T_XSRD = 199;
    static const Uint8 DDR_T_RTP = 1;
    static const Uint8 DDR_T_CKE = 2;
    static const Uint16 DDR_RR = 1053;
    static const Uint8 DDR_READ_Latency = 5; 

DDR2时钟采用默认的162MHz,不必修改PLL2的配置。其他参数基本与MT47H64M16BT一致,也不作修改。
2)在device.c中的Uint32 DEVICE_DDR2Init()函数中第432至441行,修改寄存器SBCR的值:
// modified by Dashon 2012.3.16
  // For K4T1G164QE @ 162 MHz
  // Setup the read latency (CAS Latency + 3 = 6 (but write 6-1=5))
  DDR->DDRPHYCR = (0x50006400) | DDR_READ_Latency;
  // Set TIMUNLOCK bit, CAS LAtency 3, 8 banks, 512-word page size 
  //DDR->SDBCR = 0x0013C631;
  DDR->SDBCR =  0x0013c000 |
                (DDR_NM << 14)   |
                (DDR_CL << 9)    |
                (DDR_IBANK << 4) |
                (DDR_PAGESIZE <<0);

2、移植Nand Flash

1)在device.h中第109行,修改BusWidth为8:
#define DEVICE_BOOTCFG_EMIFWIDTH_MASK  (0x00000000)//BusWidth=8,modified by Dashon,2012.3.16
2)在device_nand.c中const NAND_CHIP_InfoObj DEVICE_NAND_CHIP_infoTable[]的定义中增加NAND512-A的信息:
{ 0x79,   8192,       32,     512+16},// 128 MB
  { 0xFF,   32768,      32,    512+16},// 512 MB,devID尚未确定,added by Dashon,2012.3.18
  { 0xA1,   1024,       64,     2048+64}, // 128 MB - Big Block
第一个数字是devID,我暂时还没确定NAND1G-B的devID,在进行调试nand flash读取设备ID才能确定,这里先用0xFF代替。

3、其它

由于板子没有I2C,需在device.c的Uint32 DEVICE_init()函数屏蔽掉I2C的初始化:
// I2C0 Setup
  //if (status == E_PASS) status |= DEVICE_I2C0Init();//modified by Dashon,2012.3.16

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/253459.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python接口自动化测试(二)-requests.get()

环境搭建好后&#xff0c;接下来我们先来了解一下requests的一些简单使用&#xff0c;主要包括&#xff1a; requests常用请求方法使用&#xff0c;包括&#xff1a;get&#xff0c;postrequests库中的Session、Cookie的使用其它高级部分&#xff1a;认证、代理、证书验证、超时…

从一个Android码农视角回顾2018GDD大会

两天的GDD大会结束了&#xff0c;很开心&#xff0c;可以看得出&#xff0c;这次Google真的很用心。不但分享的内容质量很高。而且又有得吃又有得玩&#xff0c;还有许多好看的小姐姐&#xff0c;真不妄我请了两天年假来参加这个大会。先来几张图镇楼 哈哈&#xff0c;跑题了。…

Python3.x和Python2.x的区别[转]

Python3.x和Python2.x的区别 1.性能 Py3.0运行 pystone benchmark的速度比Py2.5慢30%。Guido认为Py3.0有极大的优化空间&#xff0c;在字符串和整形操作上可 以取得很好的优化结果。 Py3.1性能比Py2.5慢15%&#xff0c;还有很大的提升空间。 2.编码 Py3.X源码文件默认使用utf-8…

数字图像处理——图像锐化

图像增强是图像处理的一个重要环节,早期的图像处理就是从图像增强开始的,人们研究对质量低的图像进行处理以获得改善质量后的图像。现今的图像增强还为后续的图像处理,如图像信息提取、图像识别等,提供更高识别度的图像。 从图像处理技术来看,图像的摄取、编码、传输和处理…

DAVINCI DM365-DM368开发攻略——U-BOOT-2010.12及UBL的移植

从盛夏走到深秋&#xff0c;我们继续DAVINCI DM365-DM368的开发。说来惭愧&#xff0c;人家51CTO热情支持本博客&#xff0c;而本人却一直没有像其他博客之星一样频繁更新博客&#xff0c;心里确实说不过去。管理公司确实很累&#xff0c;有更急的客户的项目要做&#xff0c;我…

陈天艺1636050045假设跑步者1小时40分钟35秒跑了24英里。编写一个程序显示每小时以公里为单位的平均速度值...

public class AverageSpeed{ public static void main(String[]args){ double speedkm 60/(45.5/14); double speedm speedkm /1.6; system.out.println&#xff08;“averagespeed ”speedm "m/h"&#xff09; } }转载于:https://www.cnblogs.com/Archon-Cty/p/7…

EMVA 1288 测试标准

一、概述 如果要对比两台相机的性能,我们应该关注哪些参数呢,是焦距、像素、还是光圈大小?这些参数通常广为人知,并且很容易做出对比。但在一些专业领域,例如机器视觉、自动驾驶等行业,计算机算法对图像有着独特的要求,这些标准有些已经跟不上数字成像的发展步伐,而且其…

Spring Boot - 修改Tomcat默认的8080端口

前言 默认情况下&#xff0c;Spring Boot内置的Tomcat服务会使用8080端口启动&#xff0c;我们可以使用以下任何技巧去更改默认的Tomcat端口&#xff1b; 注&#xff1a;我们可以通过server.port0配置&#xff0c;去自动配置一个未被占用的http端口&#xff0c;由操作系统实现。…

2017年度目标

语言&#xff1a;python&#xff0c;lisp&#xff0c;js&#xff0c;html5技术&#xff1a;android&#xff0c;hadoop数学&#xff1a;复变函数&#xff0c;代数&#xff0c;概率&#xff0c;数论英语&#xff1a;reading其他&#xff1a;金融/经济/股票&#xff0c;历史/史记…

嵌入式系统系统升级内核双备份的实现方式

1.nand flash MTD分区 kernels/linux-2.6.31.1-cavm1/drivers/mtd/maps/xxxxx-flash.c /* MTD partitions: From CNW5602 32MB * mtd0: 0x000C0000 00020000 "bootloader" * mtd1: 0x00040000 00020000 "factory_config" * mt…

SerDes接口——架构与电路

随着通信技术的飞速发展&#xff0c;高速串行互连以其结构简单&#xff0c;不需要传输同步时钟&#xff0c;相比并行传输有更高数据传输效率的优点&#xff0c;成为现代通信和数据传输的重要组成部分。随着对数据传输速率要求的不断提高&#xff0c;SERDES应运而生。它是一种时…

Springboot分模块开发详解(2):建立子工程

1.创建base-entity 选中base工程&#xff0c;右键创建一个新的maven工程 自动选择了base这个目录存放子工程 创建后&#xff0c;pom.xml修改成如下内容&#xff1a; <?xml version"1.0"?> <projectxsi:schemaLocation"http://maven.apache.org/POM/4…

到天宫做客(2017寒假培训测试压轴题)

个人QQ&#xff1a;757394026团队QQ&#xff1a;466373640个人博客&#xff1a;www.doubleq.winc/noi/信息学奥数博客&#xff1a;http://www.cnblogs.com/zwfymqz 题目描述 有一天&#xff0c;我做了个梦&#xff0c;梦见我很荣幸的接到了猪八戒的邀请&#xff0c;到天宫陪他吃…

NAND FLASH分区规划

由于BOOTLOADRER、PARAMS以及内核、文件系统都在NAND FLASH上&#xff0c;因此分区就得进行统一规划。系统的NAND FLASH分区依赖于u-boot和Linux内核两方面的设置。U-Boot中的NAND分区 文件&#xff1a;include/configs/开发板.h这是Phy3250的参数&#xff0c;Phy3250采用32MB的…

图像去雾算法学习

现有的图像采集设备对外界环境的干扰非常敏感,在雾霾环境中,获取的户外图像往往退化严重,主要表现为场景特征信息模糊、对比度低、色彩失真,不利于计算机视觉系统对图像真实特征的提取,从而影响其后续的分析、理解、识别等一系列处理,很大程度上降低了视觉系统的实际应用…

训练与解码

BW算法是对某一个HMM(一个音素)进行训练&#xff0c;需要该HMM对应的观察向量(一段音频)&#xff0c;如何让一段文本中的某个音素找到对应一整段音频中的一小段音频&#xff1f;需要用到对齐来找到所有的[音素-音频]的配对。 训练时也需要解码 1&#xff0c;设训练的一句话有n…

Atlassian发布事故管理解决方案Jira Ops

Atlassian联合首席执行官兼联合创始人Scott Farquhar于9月4日宣布&#xff0c;Atlassian推出了一款名为Jira Ops的新产品&#xff0c;并且他们将收购OpsGenie。\\正如“Jira Ops \u0026amp; OpsGenie: powerful incident management”所描述的那样&#xff0c;Jira Ops是一款新…

U-Boot如何向内核传递Flash的分区信息

1.如何对nand 分区。修改mtdparts环境变量就可以了么&#xff1f; 对于目前的U-boot而言,是的.而且, 设置了mtdparts变量之后,你可以在nand read/write/erase命令中直接使用分区的名字而不必指定分区的偏移位置. set bootargs noinitrd consolettySAC0 root/dev/mtdblock3 ro…

Python爬虫学习系列教程

大家好哈&#xff0c;我呢最近在学习Python爬虫&#xff0c;感觉非常有意思&#xff0c;真的让生活可以方便很多。学习过程中我把一些学习的笔记总结下来&#xff0c;还记录了一些自己实际写的一些小爬虫&#xff0c;在这里跟大家一同分享&#xff0c;希望对Python爬虫感兴趣的…

ICer 常用网站推荐

总结一下我经常用到的IC网站&#xff0c;主要是数字IC&#xff0c;大致分资源类和资讯类吧&#xff1a; 一、资讯类 CSDN&#xff1a;目前关于IC的文章也越来越多啊。。https://www.csdn.net/ 知乎&#xff1a;目前来说应该是活跃大佬比较多。。https://www.zhihu.com/ DVCO…