|
本帖最后由 Gorgon_Meducer 于 2015-2-4 17:31 编辑
傻孩子图书工作室作品
STAFF
Hardware Design Bean
Driver Design y574924080 qufuta
Architecture Design Gorgon_Meducer
ACKNOWLEDGE
Armok
说在前面的话
这是一个极限挑战的项目。
2年前,我发起了傻孩子图书工作室这个开源组织,并邀更多的人加入开源计划,从那时起,陆陆续续
对技术抱有浓厚兴趣的坛友开始加入。经过松散而漫长的培训,现在终于开始进行第一个自发的开源项目
挑战(所谓自发是指并非由阿莫提议的项目)。
我们决定从豆瓣FM播放器开始。首先这是一个WiFi播放器,计划首先从资源相对丰富的ARM Cortex M3
芯片入手,首先完成豆瓣FM播放器的原型机。接下来,我们会不断挑战自我,逐步降低处理器级别,挑战
M0,16位机甚至是8位机;逐步降低对系统资源的消耗,降低SRAM用量使其适应小资源MCU的环境;逐步
降低成本,加深我们对嵌入式系统的理解。这会是一个漫长的过程,但千里之行始于足下,我们本来就是
一群视技术为乐趣的人。
第一个版本的原型机会采用Cortex M3级别的芯片,使用SD卡作为音乐的缓冲区,通过WiFi模块配合
lwIP网络协议栈连接豆瓣服务器,将数据首先下载到SD卡中缓存起来;系统采用一块Vx10xx MP3解码
芯片实现音乐的解码和播放。播放模块始终从SD卡中读取缓存的音乐,从而避免由于网络不稳定带来的
糟糕的播放体验。为了保护该开源项目,SD卡将不使用任何标准的文件系统,我们会将其视作一个巨大
的FLASH缓冲区使用,配合一个简单的链表式存储结构来保存和索引音乐文件。为了解决TCP下载音乐
到SD卡以及从SD进行音乐播放时产生的读写冲突,我们引入了两个SPI Flash作为中间的乒乓双缓冲介质。
第二个版本将考虑采用Cortex M0级别的芯片,并尝试将SRAM用量控制到10K以内。
- 2015-2-04
a. 更新硬件原理图,更新成品图片
- 2015-2-03
a. 完成了第一版硬件的制作,开始调试
- 2015-1-26
a. 补充了xmodem的接口依赖
- /*----------------------------------------------------------------------------*
- * DEPENDENT INTERFACE *
- *----------------------------------------------------------------------------*/
- /*! \brief xmodem lower layer byte write
- *! \param chByte xmodem usart write byte
- *! \return none
- */
- extern bool xmodem_lower_layer_write(uint8_t chByte);
- /*! \brief xmodem lower layer byte read
- *! \param pchByte xmodem usart write byte
- *! \return none
- */
- extern bool xmodem_lower_layer_read(uint8_t *pchByte);
- /*! \brief update next buffer or control transfer speed
- *! \param none
- *! \return buffer address
- */
- extern uint8_t * xmodem_call_back_receive(void);
复制代码
- 2015-1-25
a. 更新xmodem驱动
i. 修改xmodem接口,通过xmodem_init的参数来选择xmodem的工作模式(256字节模式和1K字节
模式)
- ...
- /*============================ MACROFIED FUNCTIONS ===========================*/
- #define XMODEM_CFG(__MODE, __BUFFER) \
- do { \
- xmodem_t tCFG = { \
- .pchBuffer = __BUFFER, \
- .tMode = __MODE \
- }; \
- xomdem_init(&tCFG); \
- } while (0)
- /*============================ TYPES =========================================*/
- //! \name xmodem receive configuration
- //! @{
- typedef struct {
- uint8_t *pchBuffer; //!< receive buffer
- enum {
- XMODEM_BLOCK_SZ_256 = 0,
- XMODEM_BLOCK_SZ_1K,
- } tMode;
- } xmodem_t;
- //! @}
- /*============================ GLOBAL VARIABLES ==============================*/
- /*============================ LOCAL VARIABLES ===============================*/
- /*============================ PROTOTYPES ====================================*/
- /*! \brief initialize xmodem receive service
- *! \param pchBuffer xmodem receive configuration
- * \retval true xmodem receive service initialization succeeded
- * \retval false xmodem receive service initialization failed
- */
- extern bool xomdem_init(xmodem_t *ptCFG);
- /*! \brief xmodem task
- *! \retrun fsm_rt_cpl xmodem transfer finish
- *! \retrun fsm_rt_on_going xmodem transfer on-going
- *! \retrun fsm_rt_on_err xmodem transfer error
- *! \retrun fsm_rt_asyn xmodem receive a packet
- */
- extern fsm_rt_t xomdem_task(void);
- ...
复制代码
ii. 支持多重缓冲模式(双缓冲是多重缓冲的最简单形式),用户需要在强制接口(离开他就不能
正常实现功能的接口)中,通过返回值来提供下一个数据缓冲区的指针,通过这种方式,用户
可以选择使用单缓冲(直接返回同一个缓冲的指针),或者选择多重缓冲(返回新缓冲区的指针)
这种做法的好处是可以简化用户的行为(减少不必要的由灵活度带来的出错可能),同时减少
不必要的接口API(比如用来设置Buffer的API)
- /*! \brief update next buffer or control transfer speed
- *! \param none
- *! \return buffer address
- */
- extern uint8_t * xmodem_call_back_receive(void);
复制代码
- 2015-1-14
a. 更新Vs10xx驱动
i. 完善vs10xx的驱动, 包括播放/停止/音量调节/复位/使能/禁能
- //! \name vs1003 interface
- //! @{
- DEF_INTERFACE (i_vs10xx_t)
- fsm_rt_t (*Init) (vs10xx_cfg_t *ptVsCfg);
- bool (*Enable) (void);
- bool (*Disable) (void);
- bool (*Pause) (void);
- bool (*Resume) (void);
- fsm_rt_t (*Play) (const uint8_t *pchStream, uint_fast16_t wSize);
- fsm_rt_t (*Volume) (uint8_t chLeftVol, uint8_t chRightVol);
- fsm_rt_t (*Reset) (void);
-
- struct {
- fsm_rt_t (*Write) (uint8_t chRegAddr, uint16_t hwData);
- fsm_rt_t (*Read) (uint8_t chRegAddr, uint16_t *pchData);
- } Register;
-
- END_DEF_INTERFACE (i_vs10xx_t)
- //! @}
复制代码
ii. 修改console命令, 增加音乐停止播放、继续播放、音量调节、复位vs10xx模块等命令
- ROOT bool app_init(void)
- {
- xmodem_usart_init();
- console_usart_init();
- console_init();
- do {
- static const command_t s_chCommand[] = {
- {"wsci", "\twsci \twrite sci register\r\n", &sci_write},
- {"rsci", "\trsci \tread sci register\r\n", &sci_read},
- {"puase", "\tpuase \tpuase\r\n", &play_pause},
- {"resume", "\tresume \tresume\r\n", &play_resume},
- {"reset", "\treset \treset vs10xx\r\n", &play_reset},
- {"vol", "\tvol \tvs10xx volume update\r\n", &play_vol},
- };
- console_cmd_register(s_chCommand, UBOUND(s_chCommand));
- } while (false);
- while (1) {
- uart_play_task();
- console_task();
- }
- return true;
- }
复制代码
- 2015-1-6
a. 更新第一个测试版本的数据流图
- 2015-1-4
a. 发布第一个测试版本
该版本使用改进的xmodem协议进行简单的流控制,通过超级终端播放(下载)MP3文件到
系统进行缓冲,并由系统发送到Vx10xx模块。
b. 发布Vx10xx测试驱动
该驱动包含基本的播放功能和寄存器操作接口。相关移植说明请参考压缩包中的说明文档
c. 发布完整的原型机系统结构图
相关下载
工程模板 (未更新xmodem驱动的版本)
Vx10xx的培训文档
xmodem驱动
第一版硬件原理图
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?注册
x
阿莫论坛20周年了!感谢大家的支持与爱护!!
你熬了10碗粥,别人一桶水倒进去,淘走90碗,剩下10碗给你,你看似没亏,其实你那10碗已经没有之前的裹腹了,人家的一桶水换90碗,继续卖。说白了,通货膨胀就是,你的钱是挣来的,他的钱是印来的,掺和在一起,你的钱就贬值了。
|