打印

原创连载+AM335X学习笔记(9月25日更新到105楼:触摸屏工程分析

[复制链接]
楼主: 阿南
手机看帖
扫描二维码
随时随地手机跟帖
61
阿南|  楼主 | 2015-8-18 20:28 | 只看该作者 |只看大图 回帖奖励 |倒序浏览
本帖最后由 阿南 于 2015-8-19 09:32 编辑

在AM335x Starter Kit运行调试StarterWare
BBB不带触摸LCD屏,所以起初买了国内的一款带电容LCD屏的开发板,但使用过程中发行不是很方便,因为他们只提供Linux的SDK。如果我想在上面跑StarterWare就必需自己进行移植,起初我也以为难度应该不大,但是移植调试过程中发现还是不简单的,他们不提供核心板的原理图,这给我带来了很大的困惑,经过一段时间的调试后,我还是决定买一块官方的Starter Kit。我直接从官网上下单了一块AM335x Starter Kit和XDS100v2仿真器(其实Starter Kit已经内置了XDS100v2),购买还是很方便的,使用支付宝*币直接付款,原以为要一个月或大半个月才能到货,但从下单到收到货只用了6天,不得不感叹他们的效率!
1.        在AM335x Starter Kit上运行StarterWare
直接将下述两个目标文件复制到TF卡C:\ti\AM335X_StarterWare_02_00_01_01\binary\armv7a\cgt_ccs\am335x\evmskAM335x\bootloader\Release_MMCSD\MLO
C:\ti\AM335X_StarterWare_02_00_01_01\binary\armv7a\cgt_ccs\am335x\evmskAM335x\demo\Release\app

将TF卡插入Starter Kit的MicroSD卡座,用USB线和网线将其连接到电脑主机,启动串口终端并设置。给Starter Kit上电,将启动boot并引导运行demo。

注:这里需要注意的是由于串口转USB芯片的供电是由板子提供,而不是电脑主机,所以每次上电都会和电脑连接一起,此时串口终端将不会收到数据,只由按键盘任意键后才会在终端上显示串口发送的数据,所以我们插入TF卡后,最好不要按电源按键重新下电再上电,而是使用Starter Kit的复位按键重新复位即可,这样终端会立即打印串口的信息。当然也有另外一个解决方法,就是将串口转USB芯片的电源改由电脑主机通过USB线提供,这样一接入电脑后,无论Starter Kit是否上电都一直保持连接。
2.        编译Starter Kit上运行的目标文件
方法基本和BBB相同,只不过在装入工程时将目录从beaglebone改为evmskAM335x。
3.        在线仿真调试
AM335x Starter Kit已经把XDS100v2仿真器集成到板子上了,所以直接使用USB线将板子连接到PC机上即可仿真调试,无需额外的仿真器。
在CCS左边区域Project Explorer里右键单击需要调试的工程名(如:boot),选择New->Target Configuration File:

在打开的新建配置对话框中输入配置文件名,并勾选Use shared location后,按Finish按钮:

选择仿真器和调试板或芯片,然后点击右边的Save Configuration的save按钮:

完成以上操作且给AM335x Starter Kit板子上电后,并可以点击“Test Connection”按钮进行连接测试,测试 CCS 是否能够与仿真器相连接。如果连接正常,则会弹出如下对话框:

点击工具栏中的 Debug 按钮  ,此时在 CCS 中会出现Debug窗口,如下图:

右键单击上图中的第二项,并选择Connect Target

成功连接后,如下图所示:

加载 gel 文件。点击 Tools→Gel Files,在 CCS 主窗口右下方会出现一个 Gel File 新功
能窗口,右键单击窗口内,点击Load GEL

打开C:\ti\AM335X_StarterWare_02_00_01_01\tools\gel\ AM335x_SK_1.2.gel
如下图:

然后点击主菜单 Scripts->AM335x System Initialization–>AM3358_SK_Initialization,进行初始化操作。

选择主菜单Run->Load->Load Program,装载程序。
在出现的对话框中,点击Browse按钮,打开C:\ti\AM335X_StarterWare_02_00_01_01\binary\armv7a\cgt_ccs\am335x\evmskAM335x\bootloader\Debug_MMCSD\boot
再点击OK按钮,完成装载后将进入调试界面:

此时我们就可以单步执行,或设置断点等各种调试手段。

使用特权

评论回复
62
liliang9554| | 2015-8-18 22:05 | 只看该作者
膜拜膜拜~

使用特权

评论回复
63
yszong| | 2015-8-18 22:06 | 只看该作者
楼主是南方人吧~

使用特权

评论回复
64
Xflyan| | 2015-8-19 09:11 | 只看该作者
顶一下,感觉BBB被我用来裸奔实在太可惜了,但是上系统又太庞大,没时间搞啊!

使用特权

评论回复
65
阿南|  楼主 | 2015-8-19 09:36 | 只看该作者
yszong 发表于 2015-8-18 22:06
楼主是南方人吧~

为何?

使用特权

评论回复
66
阿南|  楼主 | 2015-8-19 09:38 | 只看该作者
Xflyan 发表于 2015-8-19 09:11
顶一下,感觉BBB被我用来裸奔实在太可惜了,但是上系统又太庞大,没时间搞啊! ...

裸奔,只要能发挥出其价值,没什么可惜的,反而还很有意义。裸奔就能搞定的事情,为何要上系统呢?

使用特权

评论回复
67
gameboy22| | 2015-8-19 15:03 | 只看该作者
mark  持续关注

使用特权

评论回复
68
阿南|  楼主 | 2015-8-19 15:40 | 只看该作者
不要以为上了系统就很帅,不要以为只有Linux,只有Android才是嵌入式,没有他们就做不出产品。在功能复杂的情况下,他们确实可以给开发带来很便利,研究出更强大的产品,及缩短研发周期。但是功能不算复杂,裸跑就能实现的产品,如果一定要给他上个Linux Android或wince系统,那完全就是夏天穿羽绒服,到时BUG会和汗水一样多

使用特权

评论回复
69
zhangmangui| | 2015-8-19 22:08 | 只看该作者
跟高手继续学习

使用特权

评论回复
70
阿南|  楼主 | 2015-8-21 15:55 | 只看该作者
本帖最后由 阿南 于 2015-8-21 15:59 编辑

AM335x内存映射和启动过程
1. AM335x处理器内存映射
在分析AM335x启动之前,我们很有必要对AM335x的各种存储器及地址映射关系作一些了解,因为他保存着程序代码,及承载运行中的代码和数据。
内存映射相关的详细请参考官方《Technical Reference Manual.pdf》的P177页。

GPMC为通用内存控制器,用于外扩NOR Flash、NAND Flash等,起始地址为0x00000000,我们通常会将程序代码保存在此处。下图为通过GPMC扩展NAND、NOR Flash示例图:

Boot ROM为处理器内部的ROM,用于存放处理器自身的引导代码(出厂后已经固化,StarterWare文档里称它为RBL,Read Only Memory BootLoader),也是处理器上电及复位后最先执行的一段引导代码。

SRAM internal和L3 OCMC0是处理器内存的RAM,RBL会将例如SarterWare中的MLO从存储介质中装载到该区域执行。

0x402F0400 ~ 0x4030B800共109K,RBL将MLO装载到此区域,所以MLO最大不能超过109Kbyte。
EMIF0 SDRAM外部存储器接口SDRAM控制器,用于扩展如DDR2或DDR3 SDRAM存储器,起始地址为0x80000000,如StarterWare是由MLO将APP装载到此开始区域执行的。
2.处理器启动过程
当目标板上电或复位时,处理器开始执行位于内部Boot ROM区域的RBL:

RBL对自身的运行环境作些初始化,及设置好堆栈、看门狗、锁向环PLL和系统时钟后进入引导过程。在引导过程中会根据软件引导配置或处理器外部SYSBOOT管脚来设置引导器件列表,列表中会指明先查过哪个引导设备,再查找哪个引导设备。。。。这里的引导设备分Memory和Peripheral两种,前者有NOR、NAND、MMC和SPI-EEPROM,而后者有Ethernet、USB和UART。
根据引导列表先后,当检查到对应设备中有有效代码后就将其装载到SRAM internal和 L3 OCMC0的内部RAM中执行,如果没有检查到就循环检查,一直到最后一个也没有有效的代码后进入Dead loop。
下图为Starter Kit里SYSBOOT管脚定义,定义的启动检查设备顺序为MMC0 -> SPI0 -> UART0 -> USB0:

在电源上电复位完成时,LCD_DATA[15:0]管脚分别作为SYSBOOT[15:0]功能被锁定为配置定义。
当我们将StarterWare的引导程序MLO和应用程序app复制到TF卡插入Starter Kit时,此时RBL在扫描MMC0接口时就会读取TF卡中的MLO文件,并将其装载到内部RAM中运行。而MLO执行后则会将app装载到0x80000000开始的DDR中执行。
下图为StarterWare的UserGuide_02_00_01_01.pdf中对从SD卡引导步骤的描述:

使用特权

评论回复
71
HORSE7812| | 2015-8-24 10:59 | 只看该作者

使用特权

评论回复
72
阿南|  楼主 | 2015-8-24 20:27 | 只看该作者
Boot源代码分析

1. 代码目录结构

在CCS中导入boot工程如下:

我们可以右键单击某个文件,选择Properties来查看到该文件所在路径。上述文件基本位于C:\ti\AM335X_StarterWare_02_00_01_01\bootloader\src和C:\ti\AM335X_StarterWare_02_00_01_01\system_config\目录下,还有C:\ti\AM335X_StarterWare_02_00_01_01\third_party目录。

2.启动代码bl_init.asm分析

我们先来看bl_init.asm文件,它是在进入C语言之前运行的一段汇编代码,我们通常称它为启动代码,用于初始化ARM处理器的基本环境,给C语言的运行提供条件。为了能看懂、分析该汇编代码,我们需要对一些基础知识作些了解可查阅。
关于指令,我们可以在CCS的help里搜索。其它的知识,我们可以上网百度或google。

如上图所示,.def是在当前文件中定义被其它文件引用的变量;.ref是在当前文件中引用其它文件定义的变量;.global是定义一个全局变量,它即可以被当前文件引用,也可以被其它文件引用。

.set设置常量。

.text声明代码段入口。

.state32声明32-bit指令。

.word指定为4字节。

.end指定汇编语言的结束。

CPSR是ARM处理器的当前程序状态寄存器,共32位,其中cpsr_c代表的是这32位中的低8位,也就是控制位。Bit7、Bit6分别为FIQ和IRQ的中断禁止位,当设置为1时,相应的中断被禁止。M[4:0]为ARM各种工作模式的设定位。该寄存器只能通过MRS和MSR指令进行操作,前者为读取CPSR寄存器值保存到通用寄存器中,后者为写CPSR寄存器值。

下面就一起分析下bl_init.asm

这部分主要定义全局变量,引入变量和定义常数值。

这部分主要是初始化各种模式下的堆栈指针,且禁止FIQ、IRQ中断。

这部分循环将BBS段清0.

这部分进入到C语言的main函数,及将进入前的PC值存入lr寄存器。

将上述代码用到的变量指定为4字节,及汇编程序结束。
总结bl_init.asm共做了3件事,或称3步:
Step1: 初始化ARM各工作模式下的堆栈(共7种,但MODE_USR和MODE_SYS不需要设置堆栈),并禁止IRQ和FIO中断使能位,最后切换到MODE_SYS模式运行。
Step2:将BSS段数据清除为0
Step3: 跳转到main()函数

使用特权

评论回复
73
zhangmangui| | 2015-8-24 22:37 | 只看该作者
又更新啦   :victory:

使用特权

评论回复
74
dirtwillfly| | 2015-8-25 13:15 | 只看该作者
学习了,直播原来在论坛顶部

使用特权

评论回复
75
東南博士| | 2015-8-25 17:00 | 只看该作者
一直以为TI的才是高大上的,没想到TI也放下身段接地气了!
现在TI排名前三吧,第二还是被sumsang霸占吗?

使用特权

评论回复
76
阿南|  楼主 | 2015-8-25 17:16 | 只看该作者
東南博士 发表于 2015-8-25 17:00
一直以为TI的才是高大上的,没想到TI也放下身段接地气了!
现在TI排名前三吧,第二还是被sumsang霸占吗? ...

ARM普及后,注定了通用处理器不可能走高大上这条路

使用特权

评论回复
77
東南博士| | 2015-8-25 17:38 | 只看该作者
请问一下楼主,linux实时性强吗?适合做运动控制这一类的吗?会不会引起死机的情况?
另外第二点,AM335x可以裸奔吗?

使用特权

评论回复
78
阿南|  楼主 | 2015-8-25 20:39 | 只看该作者
東南博士 发表于 2015-8-25 17:38
请问一下楼主,linux实时性强吗?适合做运动控制这一类的吗?会不会引起死机的情况?
另外第二点,AM335x可 ...

Linux不是实时性的操作系统,如果对实时性要求很高,建议选择实时性更强的,TI应该有第三方的实时操作系统。不知博士是哪类运动控制?应该会有人用Linux做实时性要求不高的运动控制,如普通机器人。
是否会引起死机,往往是由程序设计引起的,如内存泄露等。
AM335x可以裸跑,StarterWare就是AM335x的一个裸跑项目。

使用特权

评论回复
79
gongjian32| | 2015-8-26 13:21 | 只看该作者
组织内容是怎么样子的呢? 多些干货!

使用特权

评论回复
80
gongjian32| | 2015-8-26 13:22 | 只看该作者
基于什么内核来讲? 老的platform类型的,还是设备树类型的。最好还是设备树的吧。

使用特权

评论回复
发新帖 本帖赏金 33.00元(功能说明)我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则