Woody Home Page
 
   
AR1688编程第一课
  
2011年3月31日
在AR1688卖了4年多后来写编程第一课实在是太晚了, 不过晚总比没有好. 总是有人问怎么把显示屏上的GP1266字样改成我自己的字符串? 刚刚我又读了一封这种邮件, 于是开始写这篇文章.
其实这篇文章没有多少可写的内容. 在软件API的sdcc\src\ui_str.c中有个叫LoadString的函数, 其中已经有了好几个OEM_XXXX特殊显示的字符串的改动了.
要注意的是, 改LoadString不仅会改动显示屏内容, 同时也会改变SIP消息User-Agent中的内容.
 
2012年1月7日更新
很多用户都需要增加自己的UDP或者TCP连接. 在AR1688软件中每个连接都在一个单独的文件中实现. 这一课讲如果在AR1688软件API中增加一个文件. 具体步骤:
  1. 决定新的文件放在哪个页面. 我们推荐把TCP连接放在3, UDP连接放在2.
  2. 修改sdcc\src\makefile中跟.c文件相关的2处地方.
  3. 把新的.rel文件添加到sdcc\src\linkmain.lnk. 不要把它加到文件末尾, 而要加到同一个页面的其他.rel文件一起. 否则编译时会有类似于Error: banked code exceeded bank 7 end (default 0xe000)的信息. 或者更糟糕的是, 没有出错信息, 但是链接后的文件结果是错误的.
  4. 不要在新文件中做类似于UDP_SOCKET _pTestSocket = NULL;这样的全局变量初始化(也不要在其它老文件中加全局变量初始化), 把初始化代码放在例如SntpInit这样的函数中. 否则编译时会有类似于Error: sram code exceeded code end (default 0x2000)的信息. 在我们分页面的代码结构下, SDCC不能把全局变量初始化的代码生成在我们需要的地址范围中.

 
2012年2月26日更新
原来我们设计了PCMU格式的语音提示, 用于在没有LCD的AR1688设备上方便的用语音播放IP地址. 最近几个月来有几个AR168M网络语音模块的客户都希望能够在通话过程中根据对方按键播放语音提示. 并且其中一个还在积极开发G.729语音提示功能. 本课程的内容主要在过去一周对他们的技术支持当中产生.
首先我们要准备压缩好的G.729数据. 压缩工作可以由PalmTool完成, 而且PalmTool的全部源代码都提供在PA1688软件API中, 最新的版本是1.68. 其中G.729源代码下载于ITU-T.
0.57.006演示软件代码中, 我们采用了更简单的方法得到G.729压缩数据. PA1688的自定义铃声由G.723.1和G.729压缩数据合并而成, 前2/5是G.723.1, 后3/5是G.729格式. 我下载了PA1688铃声alice.dat, 重新命名为font_alice.dat后存在了sdcc\src\res下.
下一步我们要把G.729数据存放到程序存储器. 跟PCMU一样, 我们仍旧使用字库页面8-11. 为简化更新过程, 我们现在支持类似于tftp -i xxx.xxx.xxx.xxx put font_alice.dat的命令行来直接升级字库和IVR语音提示文件.
接着我们需要读G.729数据并且在通话过程中送给对方. 由于数据存放在程序存储器中, 读数据的代码就不能再在程序存储器中运行, 而需要运行在SRAM中. 一个好的选择是main.c. 我们还需要方便的定时把数据送给对方. 由于DSP在大多数时候都会定时调用main.c中的TaskOutgoingData函数, 这里是个合适的地方用程序存储器中读出来的数据替换DSP编码出来的G.729数据. 演示代码用SYS_IVR_G729定义区分开, 在用新增加的OEM_IVRG729和老的OEM_ROIP编译选项编译时候会被包括进来.
最后我需要指出的是, 这个演示代码很原始, 还需要不少改进才能用在实际产品当中. 例如在替换G.729数据时, 总该判断一下当前是否在使用G.729 CODEC. 另外在RoIP应用中使用VAD的情况下, TaskOutgoingData函数可能会因为判断没有语音而不被调用到, 发送数据的工作就需要在isr_gpio.c中的_10msCounter函数里定时完成. 还有, 当G.729数据超过32k字节后, 还需要更多的代码来换页.

本页面尚无任何评论.

更多选项? 请先登录或者注册. metropolitan-tundra