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;认证、代理、证书验证、超时…

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

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

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

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

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…

图像去雾算法学习

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

训练与解码

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

CMOS 图像传感器——Color Filter Array

在介绍CMOS图像传感器的工作原理时候说道,像点(Sensor感光的基本单元叫做“像点”)吸收入射光后会有一定概率激发出电子,这个过程叫做光电转换。光子激发出电子会被像点下方的电场捕获并存储起来备用。像点的作用可以类比成一个盛水的小桶,它可以在一定范围内记录其捕获的…

我的一点企业做云经验

最近&#xff0c;经常有朋友问我在企业做云的经验&#xff0c;也有人问我OpenStack二次开发项目经验。正好这方面也有点经历&#xff0c;那现在就把我过往有关经历整理整理&#xff0c;总结出几条心得体会&#xff0c;分享给大家。 技术&#xff1a;我们OpenStack二次开发做了什…

【leetcode】910. Smallest Range II

题目如下&#xff1a; 解题思路&#xff1a;我的思路是先找出最大值。对于数组中任意一个元素A[i]来说&#xff0c;如果A[i] K 是B中的最大值&#xff0c;那么意味着从A[i1]开始的元素都要减去K&#xff0c;即如果有A[i] K > A[-1] - K&#xff0c;那么A[i] K 就可以作为…

CMOS图像传感器架构的演变

01、 引言 图像传感器目前用于多种应用。自 1969 年电荷耦合器件 (CCD) 发明以来&#xff0c;固态图像传感器已蔓延到各种消费市场&#xff0c;例如小型摄像机和数码相机。自 2005年以来已成为主流固态图像传感器的 CMOS 图像传感器在为 CCD 开发的技术的基础上不断发展。除了…

Python判断变量的数据类型的两种方法

2019独角兽企业重金招聘Python工程师标准>>> 1、isinstance(变量名&#xff0c;类型) def varargsql(self, sql, *args):if isinstance(args, tuple):self.cursor.execute(sql, args)self.conn.commit() 2、通过与其他已知类型的常量进行对比&#xff08;type()&…

基于事件的视觉传感器

在之前的文章里 人工智能与图像传感器_沧海一升的博客-CSDN博客_人工智能和传感器的关系第一类是图像传感器与人工智能计算相结合,即图像传感器模组除了可以输出图像之外,还可以直接输出人工智能算法计算的结果。另一类智能图像传感器则是为人工智能应用专门设计的图像传感器…

RocketMQ多Master多Slave模式部署

每个 Master 配置一个 Slave&#xff0c;有多对Master-Slave&#xff0c;HA采用同步双写方式&#xff0c;主备都写成功&#xff0c;向应用返回成功。 优点&#xff1a;数据与服务都无单点&#xff0c;Master宕机情况下&#xff0c;消息无延迟&#xff0c;服务可用性与数据可用性…

codeforces 1045 D. Interstellar battle

题目大意&#xff1a;一颗树&#xff0c;给定每个点消失的概率&#xff0c;求出连通块的期望值。要求支持修改消失概率的操作并且给出每次修改过后的期望值。注意被破坏的点不能算入连通块中。 数据范围&#xff0c;时限1S。 传送门 D. Interstellar battle 我们考虑做有根树的…

Cookie中文存储页面500问题

前段时间做cookie存储&#xff0c;直接用的菜鸟教程中的cookie设置方法&#xff0c;方法如下&#xff1a; function setCookie(cname,cvalue,exdays) {var d new Date();d.setTime(d.getTime()(exdays*24*60*60*1000));var expires "expires"d.toGMTString();docum…

IC Compiler指南——数据准备

一、概述 ICC数据设置的文件关系框图如图&#xff1a; 后端工具在数据设置阶段需要对两大类数据进行设置&#xff0c;包括从前端设计继承的综合数据 以及后端设计需要的物理数据。 综合数据主要包括前端逻辑综合已经设置过的逻辑与时序库文件、设计约束文件sdc以 及综合网表文…

iOS Xcode全面剖析

前言 前几天在公司内部做了一次关于iOS的入门分享&#xff0c;听众有PHP、Web、Android、测试、产品、UI等&#xff0c;主旨是力求不懂iOS的人能了解iOS的开发流程&#xff0c;听后都能创建一个iOS项目并打印HelloWorld。&#xff08;这是背景&#xff09;你想想就这么点需求&a…

VS2013编译OBS源码

obs源码来之&#xff1a;https://sourceforge.net/projects/obsproject/ 下载源码之后直接打开sln索引文件就行 项目打开之后 obs作为启动项 直接编译就行&#xff0c;正常应该一下就能编译成功。 在运行的时候可能会报错&#xff1a; 这个问题就需要制定一下编译输出路径&…

js图片切换

1.不同方式的图片切换 功能点:   1.页面默认循环切换,循环切换按钮获得焦点   2.点击顺序切换时,顺序切换按钮获得焦点     点击上一张时,当图片为第一张时,图片不再进行切换,图片张数和描述也不在变动;     点击下一张时,当图片为最后一张时,图片不再进行切换,图片…