最近由于项目需要,做了iPhone新的lighting接口的播放器开发,也稍微了解了一下MFI的整个认证流程。
iPhone5采用了最新的lighting接口,说是lighting,其实就是把usb接口的 DP DM 信号顺序重排一下,正反都可以插而已,其实也没什么特别的。
旧的Dock的播放器,一般都采用模拟+UART控制来实现播放。而新的接口,只有DP DM信号,也就是说只能采用USB通信,而且最可误的就是必须要有苹果的认证IC,经过认证后才能进行播放。
在音箱播放过程中,也和传统的USB音箱实现方法不同。传统的USB音箱,音箱是做为USB Speaker从机设备,电脑做为主机设备来进行播放。而苹果的播放,则是iPhone做为USB MIC从机,音箱做为主机来进行播放。这一点,和安卓的AOA协议有些类似。
因此,第一步,主要就是对苹果这个USB MIC设备的枚举,以及相关的采样控制等操作了。
然后再谈谈认证过程。
首先,我们需要一颗苹果的认证IC,一般是IIC的接口。从认证IC中读取版本信息等。
然后,对iPhone发送 StartIDPS 命令,同时获取 设备的 lingo(命令分组) 支持,通过 setfidtoken 告知苹果我们的版本信息等。再发送 EndIDPS。这样,第一步就完成了。
接下来,第二步,苹果发起 GetDevAuthenticationInfo 请求,我们需要从认证IC中读取Cert证书信息,通过命令RetDevAuthenticationInfo回给iPhone。
第三步,苹果确认证书后,发送GetDevAuthenticationSignature命令,同时会发送Challenge数据。我们将接收到的Challenge数据,写入认证IC的Challenge寄存器,等待计算完成后,从认证IC中读出Signature数据,通过RetDevAuthenticationSignature回应给iPhone。等待苹果确认后,就可以播放音乐了。
开发51时,选择IAR,而不选择Keil,一般会有两个理由:
1、IAR的编译器十分灵活,尤其是XCL的文件配置,几乎比GCC的ld文件更加强大。
2、IAR的切BANK机制了。
说到IAR的切BANK机制,就要说起IAR的版本了。
在720H以前,都是旧的BANK机制,而到了750A以后的版本,基本都是新的BANK机制了。由于这中间几个版本找不到软件下载,根据官方网站上的说明,Hanny暂且判断IAR 730A为使用新的BANK机制的一个分届版本。
在旧的BANK机制中,切BANK是这样的:
MOV DPTR, #func_ptr<br />
MOV A, #bank_num<br />
LCALL ?B_CALL
主要就是,将目标函数放入DPTR,BankNum放入 A寄存器,然后调用公共区的?B_CALL函数进行切换
而新的BANK机制中,切BANK是这样的:
LCALL func?relay
然后,relay接口如下:
func?relay: LCALL XXXX<br />
DB func_ptr
大约这样,具体可参考IAR帮助。
其实,Hanny更喜欢IAR720H的机制。何解?IAR官方虽说新的机制更好。理论上,新的机制,在多次调用时确实减少了程序的总大小,但是却浪费了宝贵的COMMON CODE区。新的版本会给每个函数生成 relay 入口,存放在 BANK_RELAYS 段中。而 BANK_RELAYS 必须放在公共区。
一般来说,旧的版本在新的IAR下编译有可能出以下错误:
Error: Segment BANK_RELAYS must be defined in a segment definition option (-Z, -b or -P)
这时,只能用回720H的版本就OK了。
在做字符串比较的时候,如果字符串数量庞大,我们会利用Hash函数来进行加速。
目前,最强大,最易用的字符串哈希函数应该是BKDRHash了吧。
BKDRHash函数的C语言原型如下:
unsigned int BKDRHash(char *str)<br />
{<br />
unsigned int seed = 131; // 31 131 1313 13131 131313 etc..<br />
unsigned int hash = 0;<br />
<br />
while (*str)<br />
{<br />
hash = hash * seed + (*str++);<br />
}<br />
<br />
return (hash & 0x7FFFFFFF);<br />
}
另外,除了BKDRHash函数外,还有:
APHash DJBHash JSHash RSHash SDBMHash 等供参考。
IAR有个关键词 __root。不过,Hanny今天又被这个关键词给坑了。
IAR有几个关键词:__root的本意是指该内容不要被链接器优化,可用于函数和变量。__no_init是指变量不需要初始化,一般给变量定位分段时要加。
按照这个理解,加上__root的,是一定要被链接了。可是今天,Hanny发现如果整个.C文件都没有调用的话,即使加上__root也是没有用的。不知道和版本有没有关。Hanny现在用的版本是IAR720H,就为了它的BANK机制。
Spirit DSP 解码处算法指标
SpiritDSP是一家提供音视频方案的公司。以下主要就是整理一下该公司提供方案的一些算法的指标,以便作为日后的评估及程序优化的一个参考指标。
MP3解码
平台 |
ARM7 |
ARM9 |
ARM9E |
ARM11 |
Tensilica HFi2 |
Cortex-M3 |
Nios II |
TI C55xx |
平均MIPS |
19.5 |
17.5 |
8 |
7.5 |
5.7 |
23 |
18 |
12 |
峰值MIPS |
25 |
22 |
10 |
9.5 |
8 |
28 |
22 |
13 |
程序大小(KB) |
16.5 |
19.7 |
15 |
16.5 |
19.9 |
13.7 |
16 |
11.4 |
常量大小(KB) |
7.5 |
7.2 |
6.6 |
7.5 |
15 |
7.6 |
6.8 |
7.5 |
连续变量(KB) |
12.1 |
12.3 |
12.1 |
12.1 |
20.1 |
12.3 |
13.3 |
12.3 |
临时变量(KB) |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
堆栈(KB) |
0.5 |
0.5 |
0.5 |
0.5 |
1 |
0.5 |
0.5 |
0.5 |
平台 |
AudioDE Revision2 |
平均MIPS |
5 |
峰值MIPS |
5.5 |
程序大小(KB) |
27 |
Y Memory(KB) |
15 |
X Memory(KB) |
12 |
WMA解码
阅读剩余部分...