ROCK260x 软件培训
黄激流 ——Mini MP4 方案
福州瑞芯微电子有限公司 2006-7-18
培训内容
l ROCK 260x 简介
l 系统软件结构概述
l 主要功能模块
l 内存分配
l MP3解码流程举例
l 开发工具使用
l 主要功能函数的使用说明
名词(术语)
l Firmware: 固件文件。最后用于烧录的文件,包含运行代码及相关的资源文件(图片,字库)
l Resource File: 资源文件。指本方案中固件运行所需要的一些支持性文件。包含下列几个文件:
Ø Image.res: 图片资源
Ø Menu.res: 菜单资源
l IM : Instruction Memory
l DM: Data Memory
RK2602、 RK2602 、RK2606、RK2606等芯片中IM Size = 56K words
DM Size = 48K words
ROCK 260x 简介
Features
l 128/100 pins LQFP package
l Typical power voltage 3.3V(IO), 1.8V(Core)
l Use one 24MHz crystal oscillator
l 32GPIO (8bits P0,P1,P3,16bits P2)
l 10-bit low resolution ADC with 4-channel Analog Input
l Build in Stereo 24-bit Delta-Sigma DAC with on-chip headphone amplifier
l Build in Stereo 16-bit Sigma-Delta ADC (Line-in /FM Input/ Microphone with analog mixer)
l 40 levels digital volume control
l Support external CODEC through I2DSP interface
l Support I2C interface
l Support USB 2.0 high speed and full speed
l Integrated 3 Channel DMA
l Embedded DSP Core:
l 4K words Boot Sync ROM
l (48 + 56)K words Sync SRAM
l 2K words Register Space for Peripherals
l Upgradable firmware through USB/Flash interface
l Memory interface:
l External up to 2(cs) x 64M-2G bytes Nand type Flash accessed by DMA
l Support both 8-bit (X8 device) and 16-bit (X16 device) IO bus
l Support SDRAM
l Support SD/MMC
l Support External NOR-Flash boot up
l Video Driver: Support TFT LCD/ OLED Interface
l Pulse Width Modulators for EL backlights
l Support watchdog timer
l DSP-based Software:
l MPEG1/2/2.5 Audio Layer 1, 2, 3 decoding, Layer3 encoding
l WMA 9 decoding
l G.729 based voice recording and playback
l equalizer
l MPEG-4 @QVGA decoding
系统软件结构概述
系统软件结构
l 本版本的软件结构同大多数的嵌入式软件一样,主程序是一个无限循环的代码
l 采用查询方式执行绝大多数的任务
l 部分对时间要求严格的任务将在中断中执行
l 借用了部分任务消息的概念,但不同于操作系统中的消息
系统软件结构
——Source Code 内容介绍
l 包含的目录(1)
Ø Sys : 系统主调度与处理程序
Ø Key : 按键扫描,各功能键的处理在各自的模块中处理
Ø Display : LCD的驱动、显示控制等
Ø Include : 全局变量的定义、结构体定义、消息宏定义、系统控制宏等
Ø USB : USB 通信与FAT相关
Ø Build : 编译工程文件
Ø LIB : 系统相关库文件
Ø Resource : 与资源定义相关的宏定义
Ø Lrc : 歌词文件 *.lrc的处理
Ø Driver : Codec 的驱动代码
Ø MainMenu : 主界面处理代码
Ø MenuSetting : 设置菜单处理代码
Ø Mp3Decode : MP3解码功能实现代码
Ø AviDecode : AVI视频解码功能实现代码
Ø Browser : 资源管理器功能实现代码
Ø Encode : 录音功能的实现代码
Ø FM : FM 收音机功能的实现代码
Ø Game : 游戏功能的实现代码
Ø Jpeg : 图片浏览功能的实现代码
Ø WAVDecode : MIC录音文件的播放实现代码
Ø WMADecode : WMA音乐文件的播放实现代码
主要功能模块
10大功能模块
l 音乐播放
l 视频播放
l FM 收音机
l 图片浏览
l 文本阅读
l 录音
l 资源管理器
l 游戏
l 设置
l USB
主要功能模块——音乐播放
Ø 支持的文件格式
MP3:支持所有MP3( MPEG1/2/2.5 Audio
Layer 1, 2, 3 decoding, Layer3 encoding )
WAV:支持 Rockchip MIC 录音文件格式
WMA:支持高码率WMA(支持码率高达320K bps),
暂不支持中、低码率WMA。会做升级支持
Ø DSP的运行频率
MP3: Max: 36 MHz
(eg. In 3D mode && 44.1 Kbps),
Min: 17 MHz
(eg. In normal mode && 12 Kbps)
WAV:24 MHz ~ 34 MHz
WMA:40 MHz ~ 51 MHz
主要功能模块——视频播放
Ø 支持的文件格式
AVI: 真正支持AVI格式
Video format : XviD
Audio format : MP3
视频文件需要采用Rockchip公司的转换软件进行
SCALE 变换后才能播放。在转换时请注意目标
文件的大小要与目标机器一致。如220*176的视
频文件不能在169*128的机器上播放!!
Ø DSP的运行频率
MP3: Max: 60 MHz
(eg. Memory is SD card)
Min: 52 MHz
(eg. Memory is Nand Flash)
主要功能模块——JPEG 图片浏览
Ø 支持的文件格式
JPEG
Max size : MAX_HEIGHT = 2618 pixes
MAX_WIDTH = 3520 pixes
BMP 、QCIF
Not be supported now!
Ø DSP的运行频率
MP3: Max: 60 MHz
(eg. Memory is SD card)
Min: 52 MHz
(eg. Memory is Nand Flash)
主要功能模块——USB
Ø DSP的运行频率
Moveable Disk : Max: 72 MHz
主要功能模块——模块功能分配
|
|
功能一 |
功能二 |
|
音乐播放 |
√ |
|
|
视频播放 |
√ |
|
|
FM 收音机 |
√ |
|
|
游戏 |
|
√ |
|
录音 |
√ |
|
|
固件升级 |
√ |
|
|
图片浏览 |
|
√ |
|
设置 |
|
√ |
|
USB |
√ |
|
|
文本阅读 |
|
√ |
|
资源管理器 |
|
√ |
|
歌词显示 |
|
√ |
主要功能模块——多任务运行
从上面的模块功能分配来看, 理论上功能一可以与任意的功能二同进运行.但是考虑到系统的运行做了以下组合:
音乐播放 && TXT 阅读
收音机 && TXT 阅读 X
资源管理器 && 音乐播放
音乐播放 && JPEG浏览 X
内存分配
l ROCK 260x 的Memory是分为IM 与DM
两部分
l IM = 56k words ; DM = 48 k words
l 资源有限,模块数多?怎么解决资源?
l IM 与DM的分配控制通过链接脚本进
行控制
l 采用 overlay 来解决资源有限,模块数多
的矛盾
l This example takes 3 files and creates an overlay. File1.obj and File2.obj are both linked starting at address 0x1000. They are loaded sequentially into external memory starting at address 0x4000.
l File2 is loaded immediately after file1. The main program, main.obj is linked at address 0x2000. The data for main.obj is linked at address 0x100 in the data section of memory.
l 脚本控制标识
__attribute__((section(".avi_v_text, \"ax\"")))
Ø attribute : place “__attribute__” keyword
Ø section : Use “section” key word to define section name and attribute
Ø .avi_v_text : section name:
Ø ax : allocatable, code section
__attribute__((section(".avi_v_bss, \"aw\"")))
Ø attribute : place “__attribute__” keyword
Ø section : Use “section” key word to define section name and attribute
Ø .avi_v_bss : section name: .avi_v_bss
Ø aw : allocatable, writeable section
l 脚本文件的介绍(i)
ENTRY(__start)
MEMORY
{
/*IRAM Memory Range 0x0000--0xE000*/
IVECTS : ORIGIN = 0x0000, LENGTH = 0x0088 /* 17 interrupt vectors of 8 words */
IRAM : ORIGIN = 0x0088, LENGTH = 0x8000 /*0x6e78*/
IRAM_OVR : ORIGIN = 0x6f00, LENGTH = 0x7100
IRAM_OVR1 : ORIGIN = 0xe000, LENGTH = 0x1800
IRAM_OVR2 : ORIGIN = 0xBA00, LENGTH = 0x2600
IBOOTROM : ORIGIN = 0xf800, LENGTH = 0x0800
/*Data Memory Range 0x0000--0xC000*/
DRAMDATA : ORIGIN = 0x0000, LENGTH = 0x0400
DRAMBSS : ORIGIN = 0x0400, LENGTH = 0x1000
DRAMDATA_OVER : ORIGIN = 0x1400, LENGTH = 0xa000 /* Overlap with stack?? */
DRAMDATA_OVER1 : ORIGIN = 0xc000, LENGTH = 0x4000
}
l 脚本文件的介绍(ii)
中断向量:
.vectors : {
*(.vectors);
} > IVECTS
Overlay:
OVERLAY 0xbe00 :{ /*0xbe00*/
.exttext_6 {
*(.txt_text);
*(.setmenu_text);
}
.exttext_9{
*(.game_text);
}
}>IRAM_OVR2
l 脚本文件的介绍(iii)
堆栈设置
/* Stack should not cross 0x7fff to 0x8000 boundary */
__stack_end = 0xb400; /* Enable linker to identify if enough */
__stack_start = 0xbfff; /* Stack grows down from here */
/* 0xbfff - 0xb400 = 3k */
模块调度API函数
l int ModuleOverlay(unsigned int CodeModuleNum);
模块编号的宏定义在Resource.h中定义
l int GetResourceAddress( unsigned long *ImageLogicAddress,
unsigned long *MenuLogicAddress,
unsigned long *FontLogicAddress,
unsigned long *GBKLogicAddress,
unsigned long *SysInformationAddress);
ImageLogicAddress: 图片资源在FLASH中的首地址;
MenuLogicAddress: 菜单资源在FLASH中的首地址;
FontLogicAddress:字库资源在FLASH中的首地址;
GBKLogicAddress:LOCAL 码表在FLASH中的首地址;
SysInformationAddress:系统运行参数保存在FLASH中的首地址
MP3解码流程举例
程序主流程
MP3解码过程示例
l 系统初始化
Y CONTINUE
开机键是否按下 N POWER OFF
读取上次关机保存参数
Y 进入U盘模式
USB 插入检测,插入否? N 显示开机画面,初始化CODEC,音量设置,SD卡初始化,获取FLASH容量
l 模块1调度
相关全局变量: Sche1MsgArray[0];
相关的功能模块: MP3、WMA、WAV、AVI、
ENCODE、FM、USB、FW Update
l 模块2调度
相关全局变量: Sche2MsgArray[0];
相关的功能模块: TXT、JPEG、MenuSetting、Game 、Lrc
l 模块1调度
相关全局变量: Fun1MsgArray[];
相关宏: MSG_FUNCTION1_FILE_FIND à
call FindMusicFile();
Fun1MsgArray[]参数说明:
Fun1MsgArray[0]: 功能类型
Fun1MsgArray[1]: 查找文件类型(音乐文件、视频文件)
Fun1MsgArray[2]: 查找方向(前进、后退)
Fun1MsgArray[3]: 查找范围(目录、全部)
Fun1MsgArray[4]: 顺序(随机、顺序)
“定时”处理
Ø 低功耗状态下,超过3分钟无操作关机;
Ø 定时关机判断;
Ø HOLD 处理;
Ø DisplayRecoveryTime处理 (用于对话框的自动关闭等功能)
外设检查
Ø SD 插入检测;
Ø 耳机插入检测;à 功放的开关控制(包括外响功放与耳机功放)
Ø USB 插入检测
如果 Func1MsgArray[0] == MSG_FUNCTION1_MUSIC_MP3
从上面的Mp3DecodeProc()函数的处理过程中,并没有出现解码的过程出现,解码是怎么实现的?
音频解码在中断中完成,保证声音输出不中断!!
开发工具使用
本开发工具是针对Rockchip公司的RK260X现有芯片型号所开发的,因些如果今后有新的芯片型号出现,可能要进行更新后才能支持新的芯片型号。
为保护软件的开发者及Rockchip公司的合作伙伴的利益,对该软件进行了版权管理,因此在安装该软件后,需要向Rockchip公司提供贵公司的名称(长度不能超过20个字符),然后我们将会根据贵公司提供的名称生成一个License文件,然后通过电子邮件的方式发给贵公司。需要将该License文件拷贝到工具的安装目录后,该工具的软体才能正常使用。该软件仅供贵公司做为开发工作之用,请不要传播该工具。贵公司今后给客户的固件升级软件在我们收到贵公司提供的名称后,我们会提供相应的文件。
开发工具的安装(略)
开发工具的使用(1)
Ø 安装成功后安装程序会在桌面上创建一个快捷方式:FWTools
Ø 双击该快捷方式,出现以下窗口:
l FWTools
l RockMenu
l ImageConvert
l Edit Consumer List
开发工具的使用——固件烧录流程
主要功能函数的使用说明
l void FlashReadLogic(unsigned long x,
unsigned int *Buffer,
unsigned int Length);
函数描述:
从NAND FLASH中读取指定长度(以BYTE为单位)的数据
参数说明:
unsigned long x: 存贮器的逻辑起始地址,以BYTE为单位;
unsigned int *Buffer : 读取的数据的指针;
unsigned int Length : 所需读取的数据长度
使用:
用于需要从NAND FLASH中读取文字显示、图片显示等
l void LCD_FillRect(int x0, int y0, int x1, int y1)
函数描述:
用所设置的前景色填充LCD屏的指定矩形区域
参数说明:
int x0 : 所需填充的矩形区域的左上角x 坐标
int y0 : 所需填充的矩形区域的左上角y 坐标
int x1 : 所需填充的矩形区域的右下角x 坐标
int y1 : 所需填充的矩形区域的右下角y 坐标
使 用:
填充显示区域,也常用于开发阶段调试代码用
l void LCD_SetBkColor(unsigned int color)
函数描述:
设置LCD显示的背景色
参数说明:
unsigned int color : 以16 bit (RGB565)表示的颜色
使 用:
l void LCD_SetColor(unsigned int color)
函数描述:
设置LCD显示的前景色
参数说明:
unsigned int color : 以16 bit (RGB565)表示的颜色
使 用:
l void LCD_NFDispStringAt(int x, int y, unsigned int *pStr)
函数描述:
从指定点的位置开始显示字符串
参数说明:
int x : 显示起点的 x 坐标
int y : 显示起点的 y 坐标
unsigned int *pStr : 需要显示的字符串
使 用:
l void LCD_DispStringInRect(LCD_RECT *pDr,
LCD_RECT *pSr,
unsigned int *pStr,
unsigned int AlignMode)
函数描述:
在指定的矩形区域里显示指定的字符串
参数说明:
LCD_RECT *pDr : 实际的矩形区域
LCD_RECT *pSr : 虚拟的矩阵形区域
unsigned int *pStr : 字符串指针
unsigned int AlignMode : 对齐模式(LCD_TEXTALIGN_RIGHT
LCD_TEXTALIGN_CENTER Default )
使 用:
l unsigned int Gbk2Unicode(unsigned int code)
函数描述:
将指定的码表值转换为UNICODE以便显示字符
参数说明:
unsigned int code : Local code 值
使 用:
在多国语言的显示中使用
l void LoadSysInformation(void)
函数描述:
从FLASH中读取上次关机时保存的运行参数
参数说明:
使 用:
一般在开机时调用
l void SaveSysInformation(void)
函数描述:
保存本次运行的相关参数
参数说明:
使 用:
在需要保存参数时调用
l HANDLE FileCreate(uint8 *DirFileName)
函数描述:
创建一个空的文件
参数说明:
DirFileName文件名
使 用:
NOT_OPEN_FILE不能新建文件(可能该文件名已经存在或打开文 件数超过最大限制或磁盘空间满)
0~MAX_OPEN_FILES-1为新建文件的句柄
l uint8 FileDelete(uint8 *DirFileName)
函数描述:
删除一个文件
参数说明:
DirFileName要删除的文件名
使 用:
NOT_FIND_FILE没找到文件,FILE_LOCK文件被打开不能删除,RETURN_OK删除成功
l HANDLE FileOpen(uint8 *DirFileName, uint8 Type)
函数描述:
以指定方式打开一个文件
参数说明:
DirFileName要打开的文件名,Type打开方式(R,W)
使 用:
NOT_OPEN_FILE不能打开文件(打开文件的个数超过最大限)
0~MAX_OPEN_FILES-1为文件句柄
l uint8 FileClose(HANDLE Handle)
函数描述:
关闭指定文件
参数说明:
Handle为要关闭文件的句柄
使 用:
l uint16 FileRead(uint8 *Buf, uint16 Size, HANDLE Handle)
函数描述:
从指定打开的文件中读取Size字节到缓冲区
参数说明:
Buf数据缓冲区,Size读取字节数(最多65535字节), Handle指定文件句柄
使 用:
返回值为所读取到的数据的长度
l uint16 FileWrite(uint8 *Buf, uint16 Size, HANDLE Handle)
函数描述:
写数据到指定文件
参数说明:
Buf : 数据缓冲区
Size : 要写入的字节数(最多65535字节),
Handle : 指定文件句柄
使 用:
=Size写入成功;
<Size磁盘空间满,如果为0有可能文件不是以写方式打开
l bool FileEof(HANDLE Handle)
函数描述:
测试指定文件结束
参数说明:
Handle : 指定文件句柄
使 用:
TRUE——到文件结束,FALSE——没到文件结束
l uint8 FileSeek(int32 offset, uint8 Whence, HANDLE Handle)
函数描述:
在指定文件中搜索
参数说明:
offset——偏移量
Whence——搜索方式(SEEK_SET从文件头
SEEK_END文件尾
SEEK_CUR当前位置)
Handle——指定文件句柄
使 用:
评论