vs10xx.c 42 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480
  1. /*
  2. * Copyright (C) 2001-2007 by egnite Software GmbH. All rights reserved.
  3. *
  4. * Redistribution and use in source and binary forms, with or without
  5. * modification, are permitted provided that the following conditions
  6. * are met:
  7. *
  8. * 1. Redistributions of source code must retain the above copyright
  9. * notice, this list of conditions and the following disclaimer.
  10. * 2. Redistributions in binary form must reproduce the above copyright
  11. * notice, this list of conditions and the following disclaimer in the
  12. * documentation and/or other materials provided with the distribution.
  13. * 3. Neither the name of the copyright holders nor the names of
  14. * contributors may be used to endorse or promote products derived
  15. * from this software without specific prior written permission.
  16. *
  17. * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
  18. * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
  19. * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
  20. * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
  21. * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
  22. * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
  23. * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
  24. * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
  25. * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
  26. * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF
  27. * THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  28. * SUCH DAMAGE.
  29. *
  30. * For additional information see http://www.ethernut.de/
  31. * -
  32. *
  33. * This software has been inspired by all the valuable work done by
  34. * Jesper Hansen and Pavel Chromy. Many thanks for all their help.
  35. */
  36. /*
  37. * $Log$
  38. * Revision 1.6 2009/01/17 11:26:46 haraldkipp
  39. * Getting rid of two remaining BSD types in favor of stdint.
  40. * Replaced 'u_int' by 'unsinged int' and 'uptr_t' by 'uintptr_t'.
  41. *
  42. * Revision 1.5 2008/10/23 08:54:07 haraldkipp
  43. * Include the correct header file.
  44. *
  45. * Revision 1.4 2008/09/18 09:51:58 haraldkipp
  46. * Use the correct PORT macros.
  47. *
  48. * Revision 1.3 2008/09/02 14:30:28 haraldkipp
  49. * Make it compile for targets without specific configuration.
  50. *
  51. * Revision 1.2 2008/08/11 06:59:42 haraldkipp
  52. * BSD types replaced by stdint types (feature request #1282721).
  53. *
  54. * Revision 1.1 2007/04/12 08:59:55 haraldkipp
  55. * VS10XX decoder support added.
  56. *
  57. */
  58. #include <cfg/arch/gpio.h>
  59. #include <cfg/audio.h>
  60. #include <dev/irqreg.h>
  61. #include <dev/vs10xx.h>
  62. #include <sys/atom.h>
  63. #include <sys/event.h>
  64. #include <sys/timer.h>
  65. #include <sys/heap.h>
  66. #include <sys/bankmem.h>
  67. #include <stddef.h>
  68. #ifndef INT0
  69. #define INT0 0
  70. #define INT1 1
  71. #define INT2 2
  72. #define INT3 3
  73. #define INT4 4
  74. #define INT5 5
  75. #define INT6 6
  76. #define INT7 7
  77. #endif
  78. /*!
  79. * \addtogroup xgVs10xx
  80. */
  81. /*@{*/
  82. #if !defined(AUDIO_VS1001K) && !defined(AUDIO_VS1011E) && !defined(AUDIO_VS1002D) && !defined(AUDIO_VS1003B) && !defined(AUDIO_VS1033C) && !defined(AUDIO_VS1053B)
  83. #define AUDIO_VS1001K
  84. #endif
  85. #ifndef VS10XX_FREQ
  86. /*! \brief Decoder crystal frequency. */
  87. #define VS10XX_FREQ 12288000UL
  88. #endif
  89. #ifndef VS10XX_HWRST_DURATION
  90. /*! \brief Minimum time in milliseconds to held hardware reset low. */
  91. #define VS10XX_HWRST_DURATION 1
  92. #endif
  93. #ifndef VS10XX_HWRST_RECOVER
  94. /*! \brief Milliseconds to wait after hardware reset. */
  95. #define VS10XX_HWRST_RECOVER 10
  96. #endif
  97. #ifndef VS10XX_SWRST_RECOVER
  98. /*! \brief Milliseconds to wait after software reset. */
  99. #define VS10XX_SWRST_RECOVER VS10XX_HWRST_RECOVER
  100. #endif
  101. #ifndef VS10XX_SCI_MODE
  102. #define VS10XX_SCI_MODE 0
  103. #endif
  104. #ifndef VS10XX_SCI_RATE
  105. #define VS10XX_SCI_RATE (VS10XX_FREQ / 4)
  106. #endif
  107. #ifndef VS10XX_SDI_MODE
  108. #define VS10XX_SDI_MODE 0
  109. #endif
  110. #ifndef VS10XX_SDI_RATE
  111. #define VS10XX_SDI_RATE (VS10XX_FREQ / 4)
  112. #endif
  113. #if defined(VS10XX_SCI_SPI0_DEVICE) /* Command SPI device. */
  114. #include <dev/sppif0.h>
  115. #if defined(VS10XX_SELECT_ACTIVE_HIGH)
  116. #define SciReset(act) Sppi0ChipReset(VS10XX_SCI_SPI0_DEVICE, act)
  117. #else
  118. #define SciReset(act) Sppi0ChipReset(VS10XX_SCI_SPI0_DEVICE, !act)
  119. #endif
  120. #define SciSetMode() Sppi0SetMode(VS10XX_SCI_SPI0_DEVICE, VS10XX_SCI_MODE)
  121. #define SciSetSpeed() Sppi0SetSpeed(VS10XX_SCI_SPI0_DEVICE, VS10XX_SCI_RATE)
  122. #if defined(VS10XX_SELECT_ACTIVE_HIGH)
  123. #define SciSelect() Sppi0SelectDevice(VS10XX_SCI_SPI0_DEVICE)
  124. #define SciDeselect() Sppi0DeselectDevice(VS10XX_SCI_SPI0_DEVICE)
  125. #else
  126. #define SciSelect() Sppi0NegSelectDevice(VS10XX_SCI_SPI0_DEVICE)
  127. #define SciDeselect() Sppi0NegDeselectDevice(VS10XX_SCI_SPI0_DEVICE)
  128. #endif
  129. #define SciByte(b) Sppi0Byte(b)
  130. #elif defined(VS10XX_SCI_SBBI0_DEVICE) /* Command SPI device. */
  131. #include <dev/sbbif0.h>
  132. #if defined(VS10XX_SELECT_ACTIVE_HIGH)
  133. #define SciReset(act) Sbbi0ChipReset(VS10XX_SCI_SBBI0_DEVICE, act)
  134. #else
  135. #define SciReset(act) Sbbi0ChipReset(VS10XX_SCI_SBBI0_DEVICE, !act)
  136. #endif
  137. #define SciSetMode() Sbbi0SetMode(VS10XX_SCI_SBBI0_DEVICE, VS10XX_SCI_MODE)
  138. #define SciSetSpeed() Sbbi0SetSpeed(VS10XX_SCI_SBBI0_DEVICE, VS10XX_SCI_RATE)
  139. #if defined(VS10XX_SELECT_ACTIVE_HIGH)
  140. #define SciSelect() Sbbi0SelectDevice(VS10XX_SCI_SBBI0_DEVICE)
  141. #define SciDeselect() Sbbi0DeselectDevice(VS10XX_SCI_SBBI0_DEVICE)
  142. #else
  143. #define SciSelect() Sbbi0NegSelectDevice(VS10XX_SCI_SBBI0_DEVICE)
  144. #define SciDeselect() Sbbi0NegDeselectDevice(VS10XX_SCI_SBBI0_DEVICE)
  145. #endif
  146. #define SciByte(b) Sbbi0Byte(b)
  147. #elif defined(VS10XX_SCI_SBBI1_DEVICE) /* Command SPI device. */
  148. #include <dev/sbbif1.h>
  149. #if defined(VS10XX_SELECT_ACTIVE_HIGH)
  150. #define SciReset(act) Sbbi1ChipReset(VS10XX_SCI_SBBI1_DEVICE, act)
  151. #else
  152. #define SciReset(act) Sbbi1ChipReset(VS10XX_SCI_SBBI1_DEVICE, !act)
  153. #endif
  154. #define SciSetMode() Sbbi1SetMode(VS10XX_SCI_SBBI1_DEVICE, VS10XX_SCI_MODE)
  155. #define SciSetSpeed() Sbbi1SetSpeed(VS10XX_SCI_SBBI1_DEVICE, VS10XX_SCI_RATE)
  156. #if defined(VS10XX_SELECT_ACTIVE_HIGH)
  157. #define SciSelect() Sbbi1SelectDevice(VS10XX_SCI_SBBI1_DEVICE)
  158. #define SciDeselect() Sbbi1DeselectDevice(VS10XX_SCI_SBBI1_DEVICE)
  159. #else
  160. #define SciSelect() Sbbi1NegSelectDevice(VS10XX_SCI_SBBI1_DEVICE)
  161. #define SciDeselect() Sbbi1NegDeselectDevice(VS10XX_SCI_SBBI1_DEVICE)
  162. #endif
  163. #define SciByte(b) Sbbi1Byte(b)
  164. #elif defined(VS10XX_SCI_SBBI2_DEVICE) /* Command SPI device. */
  165. #include <dev/sbbif2.h>
  166. #if defined(VS10XX_SELECT_ACTIVE_HIGH)
  167. #define SciReset(act) Sbbi2ChipReset(VS10XX_SCI_SBBI2_DEVICE, act)
  168. #else
  169. #define SciReset(act) Sbbi2ChipReset(VS10XX_SCI_SBBI2_DEVICE, !act)
  170. #endif
  171. #define SciSetMode() Sbbi2SetMode(VS10XX_SCI_SBBI2_DEVICE, VS10XX_SCI_MODE)
  172. #define SciSetSpeed() Sbbi2SetSpeed(VS10XX_SCI_SBBI2_DEVICE, VS10XX_SCI_RATE)
  173. #if defined(VS10XX_SELECT_ACTIVE_HIGH)
  174. #define SciSelect() Sbbi2SelectDevice(VS10XX_SCI_SBBI2_DEVICE)
  175. #define SciDeselect() Sbbi2DeselectDevice(VS10XX_SCI_SBBI2_DEVICE)
  176. #else
  177. #define SciSelect() Sbbi2NegSelectDevice(VS10XX_SCI_SBBI2_DEVICE)
  178. #define SciDeselect() Sbbi2NegDeselectDevice(VS10XX_SCI_SBBI2_DEVICE)
  179. #endif
  180. #define SciByte(b) Sbbi2Byte(b)
  181. #elif defined(VS10XX_SCI_SBBI3_DEVICE) /* Command SPI device. */
  182. #include <dev/sbbif3.h>
  183. #if defined(VS10XX_SELECT_ACTIVE_HIGH)
  184. #define SciReset(act) Sbbi3ChipReset(VS10XX_SCI_SBBI3_DEVICE, act)
  185. #else
  186. #define SciReset(act) Sbbi3ChipReset(VS10XX_SCI_SBBI3_DEVICE, !act)
  187. #endif
  188. #define SciSetMode() Sbbi3SetMode(VS10XX_SCI_SBBI3_DEVICE, VS10XX_SCI_MODE)
  189. #define SciSetSpeed() Sbbi3SetSpeed(VS10XX_SCI_SBBI3_DEVICE, VS10XX_SCI_RATE)
  190. #if defined(VS10XX_SELECT_ACTIVE_HIGH)
  191. #define SciSelect() Sbbi3SelectDevice(VS10XX_SCI_SBBI3_DEVICE)
  192. #define SciDeselect() Sbbi3DeselectDevice(VS10XX_SCI_SBBI3_DEVICE)
  193. #else
  194. #define SciSelect() Sbbi3NegSelectDevice(VS10XX_SCI_SBBI3_DEVICE)
  195. #define SciDeselect() Sbbi3NegDeselectDevice(VS10XX_SCI_SBBI3_DEVICE)
  196. #endif
  197. #define SciByte(b) Sbbi3Byte(b)
  198. #else /* Command SPI device. */
  199. #define SciReset(act)
  200. #define SciSetMode() (-1)
  201. #define SciSetSpeed()
  202. #define SciSelect()
  203. #define SciDeselect()
  204. #define SciByte(b) 0
  205. #endif /* Command SPI device. */
  206. #if defined(VS10XX_SDI_SPI0_DEVICE) /* Data SPI device. */
  207. #include <dev/sppif0.h>
  208. #define SdiSetMode() Sppi0SetMode(VS10XX_SDI_SPI0_DEVICE, VS10XX_SDI_MODE)
  209. #define SdiSetSpeed() Sppi0SetSpeed(VS10XX_SDI_SPI0_DEVICE, VS10XX_SDI_RATE)
  210. #if defined(VS10XX_SELECT_ACTIVE_HIGH)
  211. #define SdiSelect() Sppi0SelectDevice(VS10XX_SDI_SPI0_DEVICE)
  212. #define SdiDeselect() Sppi0DeselectDevice(VS10XX_SDI_SPI0_DEVICE)
  213. #else
  214. #define SdiSelect() Sppi0NegSelectDevice(VS10XX_SDI_SPI0_DEVICE)
  215. #define SdiDeselect() Sppi0NegDeselectDevice(VS10XX_SDI_SPI0_DEVICE)
  216. #endif
  217. #define SdiByte(b) Sppi0Byte(b)
  218. #elif defined(VS10XX_SDI_SBBI0_DEVICE) /* Data SPI device. */
  219. #include <dev/sbbif0.h>
  220. #define SdiSetMode() Sbbi0SetMode(VS10XX_SDI_SBBI0_DEVICE, VS10XX_SDI_MODE)
  221. #define SdiSetSpeed() Sbbi0SetSpeed(VS10XX_SDI_SBBI0_DEVICE, VS10XX_SDI_RATE)
  222. #if defined(VS10XX_SELECT_ACTIVE_HIGH)
  223. #define SdiSelect() Sbbi0SelectDevice(VS10XX_SDI_SBBI0_DEVICE)
  224. #define SdiDeselect() Sbbi0DeselectDevice(VS10XX_SDI_SBBI0_DEVICE)
  225. #else
  226. #define SdiSelect() Sbbi0NegSelectDevice(VS10XX_SDI_SBBI0_DEVICE)
  227. #define SdiDeselect() Sbbi0NegDeselectDevice(VS10XX_SDI_SBBI0_DEVICE)
  228. #endif
  229. #define SdiByte(b) Sbbi0Byte(b)
  230. #elif defined(VS10XX_SDI_SBBI1_DEVICE) /* Data SPI device. */
  231. #include <dev/sbbif1.h>
  232. #define SdiSetMode() Sbbi1SetMode(VS10XX_SDI_SBBI1_DEVICE, VS10XX_SDI_MODE)
  233. #define SdiSetSpeed() Sbbi1SetSpeed(VS10XX_SDI_SBBI1_DEVICE, VS10XX_SDI_RATE)
  234. #if defined(VS10XX_SELECT_ACTIVE_HIGH)
  235. #define SdiSelect() Sbbi1SelectDevice(VS10XX_SDI_SBBI1_DEVICE)
  236. #define SdiDeselect() Sbbi1DeselectDevice(VS10XX_SDI_SBBI1_DEVICE)
  237. #else
  238. #define SdiSelect() Sbbi1NegSelectDevice(VS10XX_SDI_SBBI1_DEVICE)
  239. #define SdiDeselect() Sbbi1NegDeselectDevice(VS10XX_SDI_SBBI1_DEVICE)
  240. #endif
  241. #define SdiByte(b) Sbbi1Byte(b)
  242. #elif defined(VS10XX_SDI_SBBI2_DEVICE) /* Data SPI device. */
  243. #include <dev/sbbif2.h>
  244. #define SdiSetMode() Sbbi2SetMode(VS10XX_SDI_SBBI2_DEVICE, VS10XX_SDI_MODE)
  245. #define SdiSetSpeed() Sbbi2SetSpeed(VS10XX_SDI_SBBI2_DEVICE, VS10XX_SDI_RATE)
  246. #if defined(VS10XX_SELECT_ACTIVE_HIGH)
  247. #define SdiSelect() Sbbi2SelectDevice(VS10XX_SDI_SBBI2_DEVICE)
  248. #define SdiDeselect() Sbbi2DeselectDevice(VS10XX_SDI_SBBI2_DEVICE)
  249. #else
  250. #define SdiSelect() Sbbi2NegSelectDevice(VS10XX_SDI_SBBI2_DEVICE)
  251. #define SdiDeselect() Sbbi2NegDeselectDevice(VS10XX_SDI_SBBI2_DEVICE)
  252. #endif
  253. #define SdiByte(b) Sbbi2Byte(b)
  254. #elif defined(VS10XX_SDI_SBBI3_DEVICE) /* Data SPI device. */
  255. #include <dev/sbbif3.h>
  256. #define SdiSetMode() Sbbi3SetMode(VS10XX_SDI_SBBI3_DEVICE, VS10XX_SDI_MODE)
  257. #define SdiSetSpeed() Sbbi3SetSpeed(VS10XX_SDI_SBBI3_DEVICE, VS10XX_SDI_RATE)
  258. #if defined(VS10XX_SELECT_ACTIVE_HIGH)
  259. #define SdiSelect() Sbbi3SelectDevice(VS10XX_SDI_SBBI3_DEVICE)
  260. #define SdiDeselect() Sbbi3DeselectDevice(VS10XX_SDI_SBBI3_DEVICE)
  261. #else
  262. #define SdiSelect() Sbbi3NegSelectDevice(VS10XX_SDI_SBBI3_DEVICE)
  263. #define SdiDeselect() Sbbi3NegDeselectDevice(VS10XX_SDI_SBBI3_DEVICE)
  264. #endif
  265. #define SdiByte(b) Sbbi3Byte(b)
  266. #else /* Data SPI device. */
  267. #define SdiSetMode() (-1)
  268. #define SdiSetSpeed()
  269. #define SdiSelect()
  270. #define SdiDeselect()
  271. #define SdiByte(b) 0
  272. #endif /* Data SPI device. */
  273. /* -------------------------------------------------
  274. * AT91 port specifications.
  275. */
  276. #if MCU_AT91 || __AVR32__
  277. #if (VS10XX_SIGNAL_IRQ == INT0)
  278. #define VS10XX_SIGNAL sig_INTERRUPT0
  279. #elif (VS10XX_SIGNAL_IRQ == INT1)
  280. #define VS10XX_SIGNAL sig_INTERRUPT1
  281. #else
  282. #define VS10XX_SIGNAL sig_INTERRUPT2
  283. #endif
  284. #if defined(VS10XX_XCS_BIT)
  285. #if !defined(VS10XX_XCS_PORT)
  286. #define VS10XX_XCS_PE_REG PIO_PER
  287. #define VS10XX_XCS_OE_REG PIO_OER
  288. #define VS10XX_XCS_COD_REG PIO_CODR
  289. #define VS10XX_XCS_SOD_REG PIO_SODR
  290. #elif VS10XX_XCS_PORT == PIOA_ID
  291. #define VS10XX_XCS_PE_REG PIOA_PER
  292. #define VS10XX_XCS_OE_REG PIOA_OER
  293. #define VS10XX_XCS_COD_REG PIOA_CODR
  294. #define VS10XX_XCS_SOD_REG PIOA_SODR
  295. #elif VS10XX_XCS_PORT == PIOB_ID
  296. #define VS10XX_XCS_PE_REG PIOB_PER
  297. #define VS10XX_XCS_OE_REG PIOB_OER
  298. #define VS10XX_XCS_COD_REG PIOB_CODR
  299. #define VS10XX_XCS_SOD_REG PIOB_SODR
  300. #elif VS10XX_XCS_PORT == PIOC_ID
  301. #define VS10XX_XCS_PE_REG PIOC_PER
  302. #define VS10XX_XCS_OE_REG PIOC_OER
  303. #define VS10XX_XCS_COD_REG PIOC_CODR
  304. #define VS10XX_XCS_SOD_REG PIOC_SODR
  305. #endif
  306. #define VS10XX_XCS_ENA() \
  307. outr(VS10XX_XCS_PE_REG, _BV(VS10XX_XCS_BIT)); \
  308. outr(VS10XX_XCS_OE_REG, _BV(VS10XX_XCS_BIT))
  309. #define VS10XX_XCS_CLR() outr(VS10XX_XCS_COD_REG, _BV(VS10XX_XCS_BIT))
  310. #define VS10XX_XCS_SET() outr(VS10XX_XCS_SOD_REG, _BV(VS10XX_XCS_BIT))
  311. #else /* VS10XX_XCS_BIT */
  312. #define VS10XX_XCS_ENA()
  313. #define VS10XX_XCS_CLR()
  314. #define VS10XX_XCS_SET()
  315. #endif /* VS10XX_XCS_BIT */
  316. #if defined(VS10XX_XDCS_BIT)
  317. #if !defined(VS10XX_XDCS_PORT)
  318. #define VS10XX_XDCS_PE_REG PIO_PER
  319. #define VS10XX_XDCS_OE_REG PIO_OER
  320. #define VS10XX_XDCS_COD_REG PIO_CODR
  321. #define VS10XX_XDCS_SOD_REG PIO_SODR
  322. #elif VS10XX_XDCS_PORT == PIOA_ID
  323. #define VS10XX_XDCS_PE_REG PIOA_PER
  324. #define VS10XX_XDCS_OE_REG PIOA_OER
  325. #define VS10XX_XDCS_COD_REG PIOA_CODR
  326. #define VS10XX_XDCS_SOD_REG PIOA_SODR
  327. #elif VS10XX_XDCS_PORT == PIOB_ID
  328. #define VS10XX_XDCS_PE_REG PIOB_PER
  329. #define VS10XX_XDCS_OE_REG PIOB_OER
  330. #define VS10XX_XDCS_COD_REG PIOB_CODR
  331. #define VS10XX_XDCS_SOD_REG PIOB_SODR
  332. #elif VS10XX_XDCS_PORT == PIOC_ID
  333. #define VS10XX_XDCS_PE_REG PIOC_PER
  334. #define VS10XX_XDCS_OE_REG PIOC_OER
  335. #define VS10XX_XDCS_COD_REG PIOC_CODR
  336. #define VS10XX_XDCS_SOD_REG PIOC_SODR
  337. #endif
  338. #define VS10XX_XDCS_ENA() \
  339. outr(VS10XX_XDCS_PE_REG, _BV(VS10XX_XDCS_BIT)); \
  340. outr(VS10XX_XDCS_OE_REG, _BV(VS10XX_XDCS_BIT))
  341. #define VS10XX_XDCS_CLR() outr(VS10XX_XDCS_COD_REG, _BV(VS10XX_XDCS_BIT))
  342. #define VS10XX_XDCS_SET() outr(VS10XX_XDCS_SOD_REG, _BV(VS10XX_XDCS_BIT))
  343. #else /* VS10XX_XDCS_BIT */
  344. #define VS10XX_XDCS_ENA()
  345. #define VS10XX_XDCS_CLR()
  346. #define VS10XX_XDCS_SET()
  347. #endif /* VS10XX_XDCS_BIT */
  348. #if defined(VS10XX_DREQ_BIT)
  349. #if !defined(VS10XX_DREQ_PIO_ID)
  350. #define VS10XX_DREQ_PE_REG PIO_PER
  351. #define VS10XX_DREQ_OD_REG PIO_ODR
  352. #define VS10XX_DREQ_PDS_REG PIO_PDSR
  353. #elif VS10XX_DREQ_PIO_ID == PIOA_ID
  354. #define VS10XX_DREQ_PE_REG PIOA_PER
  355. #define VS10XX_DREQ_OD_REG PIOA_ODR
  356. #define VS10XX_DREQ_PDS_REG PIOA_PDSR
  357. #elif VS10XX_DREQ_PIO_ID == PIOB_ID
  358. #define VS10XX_DREQ_PE_REG PIOB_PER
  359. #define VS10XX_DREQ_OD_REG PIOB_ODR
  360. #define VS10XX_DREQ_PDS_REG PIOB_PDSR
  361. #elif VS10XX_DREQ_PIO_ID == PIOC_ID
  362. #define VS10XX_DREQ_PE_REG PIOC_PER
  363. #define VS10XX_DREQ_OD_REG PIOC_ODR
  364. #define VS10XX_DREQ_PDS_REG PIOC_PDSR
  365. #endif
  366. #define VS10XX_DREQ_PD_REG PIO_PDR
  367. #define VS10XX_DREQ_OD_REG PIO_ODR
  368. #define VS10XX_DREQ_PDS_REG PIO_PDSR
  369. #define VS10XX_DREQ_ENA() \
  370. outr(VS10XX_DREQ_PD_REG, _BV(VS10XX_DREQ_BIT)); \
  371. outr(VS10XX_DREQ_OD_REG, _BV(VS10XX_DREQ_BIT))
  372. #define VS10XX_DREQ_TST() ((inr(VS10XX_DREQ_PDS_REG) & _BV(VS10XX_DREQ_BIT)) == _BV(VS10XX_DREQ_BIT))
  373. #else /* VS10XX_DREQ_BIT */
  374. #define VS10XX_DREQ_ENA()
  375. #define VS10XX_DREQ_TST() 0
  376. #endif /* VS10XX_DREQ_BIT */
  377. #ifdef VS10XX_BSYNC_BIT
  378. #if !defined(VS10XX_BSYNC_PIO_ID)
  379. #define VS10XX_BSYNC_PE_REG PIO_PER
  380. #define VS10XX_BSYNC_OE_REG PIO_OER
  381. #define VS10XX_BSYNC_COD_REG PIO_CODR
  382. #define VS10XX_BSYNC_SOD_REG PIO_SODR
  383. #elif VS10XX_BSYNC_PIO_ID == PIOA_ID
  384. #define VS10XX_BSYNC_PE_REG PIOA_PER
  385. #define VS10XX_BSYNC_OE_REG PIOA_OER
  386. #define VS10XX_BSYNC_COD_REG PIOA_CODR
  387. #define VS10XX_BSYNC_SOD_REG PIOA_SODR
  388. #elif VS10XX_BSYNC_PIO_ID == PIOB_ID
  389. #define VS10XX_BSYNC_PE_REG PIOB_PER
  390. #define VS10XX_BSYNC_OE_REG PIOB_OER
  391. #define VS10XX_BSYNC_COD_REG PIOB_CODR
  392. #define VS10XX_BSYNC_SOD_REG PIOB_SODR
  393. #elif VS10XX_BSYNC_PIO_ID == PIOC_ID
  394. #define VS10XX_BSYNC_PE_REG PIOC_PER
  395. #define VS10XX_BSYNC_OE_REG PIOC_OER
  396. #define VS10XX_BSYNC_COD_REG PIOC_CODR
  397. #define VS10XX_BSYNC_SOD_REG PIOC_SODR
  398. #endif
  399. #define VS10XX_BSYNC_ENA() \
  400. outr(VS10XX_BSYNC_PE_REG, _BV(VS10XX_BSYNC_BIT)); \
  401. outr(VS10XX_BSYNC_OE_REG, _BV(VS10XX_BSYNC_BIT))
  402. #define VS10XX_BSYNC_CLR() outr(VS10XX_BSYNC_COD_REG, _BV(VS10XX_BSYNC_BIT))
  403. #define VS10XX_BSYNC_SET() outr(VS10XX_BSYNC_SOD_REG, _BV(VS10XX_BSYNC_BIT))
  404. #else /* VS10XX_BSYNC_BIT */
  405. #define VS10XX_BSYNC_ENA()
  406. #define VS10XX_BSYNC_CLR()
  407. #define VS10XX_BSYNC_SET()
  408. #endif /* VS10XX_BSYNC_BIT */
  409. /* -------------------------------------------------
  410. * AVR port specifications.
  411. */
  412. #elif defined(__AVR__)
  413. #if !defined(VS10XX_SIGNAL_IRQ)
  414. #define VS10XX_SIGNAL_IRQ INT6
  415. #endif
  416. #if (VS10XX_SIGNAL_IRQ == INT0)
  417. #define VS10XX_SIGNAL sig_INTERRUPT0
  418. #define VS10XX_DREQ_BIT 0
  419. #define VS10XX_DREQ_PDS_REG PIND
  420. #define VS10XX_DREQ_PUE_REG PORTD
  421. #define VS10XX_DREQ_OE_REG DDRD
  422. #elif (VS10XX_SIGNAL_IRQ == INT1)
  423. #define VS10XX_SIGNAL sig_INTERRUPT1
  424. #define VS10XX_DREQ_BIT 1
  425. #define VS10XX_DREQ_PDS_REG PIND
  426. #define VS10XX_DREQ_PUE_REG PORTD
  427. #define VS10XX_DREQ_OE_REG DDRD
  428. #elif (VS10XX_SIGNAL_IRQ == INT2)
  429. #define VS10XX_SIGNAL sig_INTERRUPT2
  430. #define VS10XX_DREQ_BIT 2
  431. #define VS10XX_DREQ_PDS_REG PIND
  432. #define VS10XX_DREQ_PUE_REG PORTD
  433. #define VS10XX_DREQ_OE_REG DDRD
  434. #elif (VS10XX_SIGNAL_IRQ == INT3)
  435. #define VS10XX_SIGNAL sig_INTERRUPT3
  436. #define VS10XX_DREQ_BIT 3
  437. #define VS10XX_DREQ_PDS_REG PIND
  438. #define VS10XX_DREQ_PUE_REG PORTD
  439. #define VS10XX_DREQ_OE_REG DDRD
  440. #elif (VS10XX_SIGNAL_IRQ == INT4)
  441. #define VS10XX_SIGNAL sig_INTERRUPT4
  442. #define VS10XX_DREQ_BIT 4
  443. #define VS10XX_DREQ_PDS_REG PINE
  444. #define VS10XX_DREQ_PUE_REG PORTE
  445. #define VS10XX_DREQ_OE_REG DDRE
  446. #elif (VS10XX_SIGNAL_IRQ == INT5)
  447. #define VS10XX_SIGNAL sig_INTERRUPT5
  448. #define VS10XX_DREQ_BIT 5
  449. #define VS10XX_DREQ_PDS_REG PINE
  450. #define VS10XX_DREQ_PUE_REG PORTE
  451. #define VS10XX_DREQ_OE_REG DDRE
  452. #elif (VS10XX_SIGNAL_IRQ == INT7)
  453. #define VS10XX_SIGNAL sig_INTERRUPT7
  454. #define VS10XX_DREQ_BIT 7
  455. #define VS10XX_DREQ_PDS_REG PINE
  456. #define VS10XX_DREQ_PUE_REG PORTE
  457. #define VS10XX_DREQ_OE_REG DDRE
  458. #else
  459. #define VS10XX_SIGNAL sig_INTERRUPT6
  460. #define VS10XX_DREQ_BIT 6
  461. #define VS10XX_DREQ_PDS_REG PINE
  462. #define VS10XX_DREQ_PUE_REG PORTE
  463. #define VS10XX_DREQ_OE_REG DDRE
  464. #endif
  465. #define VS10XX_DREQ_ENA() \
  466. cbi(VS10XX_DREQ_OE_REG, VS10XX_DREQ_BIT); \
  467. sbi(VS10XX_DREQ_PUE_REG, VS10XX_DREQ_BIT)
  468. #define VS10XX_DREQ_TST() ((inb(VS10XX_DREQ_PDS_REG) & _BV(VS10XX_DREQ_BIT)) == _BV(VS10XX_DREQ_BIT))
  469. #if defined(VS10XX_XCS_BIT)
  470. #if (VS10XX_XCS_PORT == AVRPORTA)
  471. #define VS10XX_XCS_SOD_REG PORTA
  472. #define VS10XX_XCS_OE_REG DDRA
  473. #elif (VS10XX_XCS_PORT == AVRPORTB)
  474. #define VS10XX_XCS_SOD_REG PORTB
  475. #define VS10XX_XCS_OE_REG DDRB
  476. #elif (VS10XX_XCS_PORT == AVRPORTD)
  477. #define VS10XX_XCS_SOD_REG PORTD
  478. #define VS10XX_XCS_OE_REG DDRD
  479. #elif (VS10XX_XCS_PORT == AVRPORTE)
  480. #define VS10XX_XCS_SOD_REG PORTE
  481. #define VS10XX_XCS_OE_REG DDRE
  482. #elif (VS10XX_XCS_PORT == AVRPORTF)
  483. #define VS10XX_XCS_SOD_REG PORTF
  484. #define VS10XX_XCS_OE_REG DDRF
  485. #elif (VS10XX_XCS_PORT == AVRPORTG)
  486. #define VS10XX_XCS_SOD_REG PORTG
  487. #define VS10XX_XCS_OE_REG DDRG
  488. #elif (VS10XX_XCS_PORT == AVRPORTH)
  489. #define VS10XX_XCS_SOD_REG PORTH
  490. #define VS10XX_XCS_OE_REG DDRH
  491. #endif
  492. #define VS10XX_XCS_ENA() sbi(VS10XX_XCS_OE_REG, VS10XX_XCS_BIT)
  493. #define VS10XX_XCS_CLR() cbi(VS10XX_XCS_SOD_REG, VS10XX_XCS_BIT)
  494. #define VS10XX_XCS_SET() sbi(VS10XX_XCS_SOD_REG, VS10XX_XCS_BIT)
  495. #else /* VS10XX_XCS_BIT */
  496. #define VS10XX_XCS_ENA()
  497. #define VS10XX_XCS_CLR()
  498. #define VS10XX_XCS_SET()
  499. #endif /* VS10XX_XCS_BIT */
  500. #if defined(VS10XX_XDCS_BIT)
  501. #if (VS10XX_XDCS_PORT == AVRPORTA)
  502. #define VS10XX_XDCS_SOD_REG PORTA
  503. #define VS10XX_XDCS_OE_REG DDRA
  504. #elif (VS10XX_XDCS_PORT == AVRPORTB)
  505. #define VS10XX_XDCS_SOD_REG PORTB
  506. #define VS10XX_XDCS_OE_REG DDRB
  507. #elif (VS10XX_XDCS_PORT == AVRPORTD)
  508. #define VS10XX_XDCS_SOD_REG PORTD
  509. #define VS10XX_XDCS_OE_REG DDRD
  510. #elif (VS10XX_XDCS_PORT == AVRPORTE)
  511. #define VS10XX_XDCS_SOD_REG PORTE
  512. #define VS10XX_XDCS_OE_REG DDRE
  513. #elif (VS10XX_XDCS_PORT == AVRPORTF)
  514. #define VS10XX_XDCS_SOD_REG PORTF
  515. #define VS10XX_XDCS_OE_REG DDRF
  516. #elif (VS10XX_XDCS_PORT == AVRPORTG)
  517. #define VS10XX_XDCS_SOD_REG PORTG
  518. #define VS10XX_XDCS_OE_REG DDRG
  519. #elif (VS10XX_XDCS_PORT == AVRPORTH)
  520. #define VS10XX_XDCS_SOD_REG PORTH
  521. #define VS10XX_XDCS_OE_REG DDRH
  522. #endif
  523. #define VS10XX_XDCS_ENA() sbi(VS10XX_XDCS_OE_REG, VS10XX_XDCS_BIT)
  524. #define VS10XX_XDCS_CLR() cbi(VS10XX_XDCS_SOD_REG, VS10XX_XDCS_BIT)
  525. #define VS10XX_XDCS_SET() sbi(VS10XX_XDCS_SOD_REG, VS10XX_XDCS_BIT)
  526. #else /* VS10XX_XDCS_BIT */
  527. #define VS10XX_XDCS_ENA()
  528. #define VS10XX_XDCS_CLR()
  529. #define VS10XX_XDCS_SET()
  530. #endif /* VS10XX_XDCS_BIT */
  531. #if defined(VS10XX_BSYNC_BIT)
  532. #if (VS10XX_BSYNC_PORT == AVRPORTA)
  533. #define VS10XX_BSYNC_SOD_REG PORTA
  534. #define VS10XX_BSYNC_OE_REG DDRA
  535. #elif (VS10XX_BSYNC_PORT == AVRPORTB)
  536. #define VS10XX_BSYNC_SOD_REG PORTB
  537. #define VS10XX_BSYNC_OE_REG DDRB
  538. #elif (VS10XX_BSYNC_PORT == AVRPORTD)
  539. #define VS10XX_BSYNC_SOD_REG PORTD
  540. #define VS10XX_BSYNC_OE_REG DDRD
  541. #elif (VS10XX_BSYNC_PORT == AVRPORTE)
  542. #define VS10XX_BSYNC_SOD_REG PORTE
  543. #define VS10XX_BSYNC_OE_REG DDRE
  544. #elif (VS10XX_BSYNC_PORT == AVRPORTF)
  545. #define VS10XX_BSYNC_SOD_REG PORTF
  546. #define VS10XX_BSYNC_OE_REG DDRF
  547. #elif (VS10XX_BSYNC_PORT == AVRPORTG)
  548. #define VS10XX_BSYNC_SOD_REG PORTG
  549. #define VS10XX_BSYNC_OE_REG DDRG
  550. #elif (VS10XX_BSYNC_PORT == AVRPORTH)
  551. #define VS10XX_BSYNC_SOD_REG PORTH
  552. #define VS10XX_BSYNC_OE_REG DDRH
  553. #endif
  554. #define VS10XX_BSYNC_ENA() sbi(VS10XX_BSYNC_OE_REG, VS10XX_BSYNC_BIT)
  555. #define VS10XX_BSYNC_CLR() cbi(VS10XX_BSYNC_SOD_REG, VS10XX_BSYNC_BIT)
  556. #define VS10XX_BSYNC_SET() sbi(VS10XX_BSYNC_SOD_REG, VS10XX_BSYNC_BIT)
  557. #else /* VS10XX_BSYNC_BIT */
  558. #define VS10XX_BSYNC_ENA()
  559. #define VS10XX_BSYNC_CLR()
  560. #define VS10XX_BSYNC_SET()
  561. #endif /* VS10XX_BSYNC_BIT */
  562. /* -------------------------------------------------
  563. * End of port specifications.
  564. */
  565. #endif
  566. static volatile ureg_t vs_status = VS_STATUS_STOPPED;
  567. static volatile unsigned int vs_flush;
  568. /*
  569. * \brief Write a byte to the VS10XX data interface.
  570. *
  571. * The caller is responsible for checking the DREQ line. Also make sure,
  572. * that decoder interrupts are disabled.
  573. *
  574. * \param b Byte to be shifted to the decoder's data interface.
  575. */
  576. static INLINE void VsSdiPutByte(ureg_t b)
  577. {
  578. #if defined(VS10XX_BSYNC_BIT)
  579. #if defined(VS10XX_SDI_SBBI0_DEVICE) /* VS10XX_SDI_DEVICE */
  580. ureg_t mask;
  581. VS10XX_BSYNC_SET();
  582. for (mask = 0x80; mask; mask >>= 1) {
  583. SBBI0_SCK_CLR();
  584. if (b & mask) {
  585. SBBI0_MOSI_SET();
  586. }
  587. else {
  588. SBBI0_MOSI_CLR();
  589. }
  590. SBBI0_SCK_SET();
  591. if (mask & 0x40) {
  592. VS10XX_BSYNC_CLR();
  593. }
  594. }
  595. SBBI0_SCK_CLR();
  596. #elif defined(VS10XX_SDI_SBBI1_DEVICE) /* VS10XX_SDI_DEVICE */
  597. ureg_t mask;
  598. VS10XX_BSYNC_SET();
  599. for (mask = 0x80; mask; mask >>= 1) {
  600. SBBI1_SCK_CLR();
  601. if (b & mask) {
  602. SBBI1_MOSI_SET();
  603. }
  604. else {
  605. SBBI1_MOSI_CLR();
  606. }
  607. SBBI1_SCK_SET();
  608. if (mask & 0x40) {
  609. VS10XX_BSYNC_CLR();
  610. }
  611. }
  612. SBBI1_SCK_CLR();
  613. #elif defined(VS10XX_SDI_SBBI2_DEVICE) /* VS10XX_SDI_DEVICE */
  614. ureg_t mask;
  615. VS10XX_BSYNC_SET();
  616. for (mask = 0x80; mask; mask >>= 1) {
  617. SBBI2_SCK_CLR();
  618. if (b & mask) {
  619. SBBI2_MOSI_SET();
  620. }
  621. else {
  622. SBBI2_MOSI_CLR();
  623. }
  624. SBBI2_SCK_SET();
  625. if (mask & 0x40) {
  626. VS10XX_BSYNC_CLR();
  627. }
  628. }
  629. SBBI2_SCK_CLR();
  630. #elif defined(VS10XX_SDI_SBBI3_DEVICE) /* VS10XX_SDI_DEVICE */
  631. ureg_t mask;
  632. VS10XX_BSYNC_SET();
  633. for (mask = 0x80; mask; mask >>= 1) {
  634. SBBI3_SCK_CLR();
  635. if (b & mask) {
  636. SBBI3_MOSI_SET();
  637. }
  638. else {
  639. SBBI3_MOSI_CLR();
  640. }
  641. SBBI3_SCK_SET();
  642. if (mask & 0x40) {
  643. VS10XX_BSYNC_CLR();
  644. }
  645. }
  646. SBBI3_SCK_CLR();
  647. #elif defined(VS10XX_SDI_SPI0_DEVICE) /* VS10XX_SDI_DEVICE */
  648. VS10XX_BSYNC_SET();
  649. outb(SPDR, b);
  650. _NOP();
  651. _NOP();
  652. _NOP();
  653. _NOP();
  654. VS10XX_BSYNC_CLR();
  655. /* Wait for SPI transfer to finish. */
  656. loop_until_bit_is_set(SPSR, SPIF);
  657. #endif /* VS10XX_SDI_DEVICE */
  658. #else /* !VS10XX_BSYNC_BIT */
  659. (void)SdiByte(b);
  660. #endif /* !VS10XX_BSYNC_BIT */
  661. }
  662. /*!
  663. * \brief Enable or disable player interrupts.
  664. *
  665. * This routine is typically used by applications when dealing with
  666. * unprotected buffers.
  667. *
  668. * \param enable Disables interrupts when zero. Otherwise interrupts
  669. * are enabled.
  670. *
  671. * \return Zero if interrupts were disabled before this call.
  672. */
  673. ureg_t VsPlayerInterrupts(ureg_t enable)
  674. {
  675. static ureg_t is_enabled = 0;
  676. ureg_t rc;
  677. rc = is_enabled;
  678. if(enable) {
  679. VS10XX_DREQ_ENA();
  680. NutIrqEnable(&VS10XX_SIGNAL);
  681. }
  682. else {
  683. NutIrqDisable(&VS10XX_SIGNAL);
  684. }
  685. is_enabled = enable;
  686. return rc;
  687. }
  688. /*!
  689. * \brief Throttle decoder activity.
  690. *
  691. * When sharing SPI with other devices, this function should be called
  692. * to disable (and re-enable) the SPI interface of the VS10XX.
  693. *
  694. * Decoder interrupts must have been disabled before calling this
  695. * function.
  696. *
  697. * \code
  698. * #include <dev/vs10xx.h>
  699. *
  700. * ureg_t ief = VsPlayerInterrupts(0);
  701. * ureg_t tef = VsPlayerThrottle(1);
  702. * ... use other SPI devices here ...
  703. * VsPlayerThrottle(tef);
  704. * VsPlayerInterrupts(ief);
  705. * \endcode
  706. *
  707. * \param on Throttles (disables) the decoder interface if not zero.
  708. * Otherwise the decoder interface is enabled again.
  709. *
  710. * \return Zero if the interface was enabled before this call.
  711. */
  712. ureg_t VsPlayerThrottle(ureg_t on)
  713. {
  714. static ureg_t is_throttled = 0;
  715. ureg_t rc;
  716. rc = is_throttled;
  717. if(on) {
  718. VS10XX_XDCS_SET();
  719. SdiDeselect();
  720. }
  721. else {
  722. VS10XX_XDCS_CLR();
  723. SdiSelect();
  724. }
  725. is_throttled = on;
  726. return rc;
  727. }
  728. /*!
  729. * \brief Switch to or switch back from command mode.
  730. */
  731. static void VsSciSelect(ureg_t on)
  732. {
  733. if (on) {
  734. /* Disable data interface. */
  735. SdiDeselect();
  736. #if defined(VS10XX_SDI_SPI0_DEVICE) && !defined(VS10XX_SCI_SPI0_DEVICE)
  737. /* Hint given by Jesper Hansen: If data channel uses HW SPI and
  738. command channel uses SW SPI, then disable HW SPI while sending
  739. using the command channel. */
  740. cbi(SPCR, SPE);
  741. #endif
  742. /* Deselect data channel. */
  743. VS10XX_XDCS_SET();
  744. /* Select cmd channel. */
  745. VS10XX_XCS_CLR();
  746. /* Enable cmd interface. */
  747. SciSelect();
  748. }
  749. else {
  750. /* Disable cmd interface. */
  751. SciDeselect();
  752. /* Deselect cmd channel. */
  753. VS10XX_XCS_SET();
  754. /* Re-select data channel. */
  755. VS10XX_XDCS_CLR();
  756. /* Enable data interface. */
  757. SdiSelect();
  758. }
  759. }
  760. /*!
  761. * \brief Wait for decoder ready.
  762. *
  763. * This function will check the DREQ line. Decoder interrupts must have
  764. * been disabled before calling this function.
  765. */
  766. static int VsWaitReady(void)
  767. {
  768. int tmo;
  769. for (tmo = 0; tmo < 5000; tmo++) {
  770. if (VS10XX_DREQ_TST()) {
  771. return 0;
  772. }
  773. }
  774. return -1;
  775. }
  776. /*
  777. * \brief Write a specified number of bytes to the VS10XX data interface.
  778. *
  779. * This function will check the DREQ line. Decoder interrupts must have
  780. * been disabled before calling this function.
  781. */
  782. static int VsSdiWrite(const uint8_t * data, size_t len)
  783. {
  784. while (len--) {
  785. if (!VS10XX_DREQ_TST() && VsWaitReady()) {
  786. return -1;
  787. }
  788. VsSdiPutByte(*data);
  789. data++;
  790. }
  791. return 0;
  792. }
  793. /*
  794. * \brief Write a specified number of bytes from program space to the
  795. * VS10XX data interface.
  796. *
  797. * This function is similar to VsSdiWrite() except that the data is
  798. * located in program space.
  799. */
  800. static int VsSdiWrite_P(PGM_P data, size_t len)
  801. {
  802. while (len--) {
  803. if (!VS10XX_DREQ_TST() && VsWaitReady()) {
  804. return -1;
  805. }
  806. VsSdiPutByte(PRG_RDB(data));
  807. data++;
  808. }
  809. return 0;
  810. }
  811. /*
  812. * \brief Write to a decoder register.
  813. *
  814. * Decoder interrupts must have been disabled before calling this function.
  815. */
  816. static void VsRegWrite(ureg_t reg, uint16_t data)
  817. {
  818. /* Select command channel. */
  819. VsWaitReady();
  820. VsSciSelect(1);
  821. /*
  822. * The VS1011E datasheet demands a minimum of 5 ns between
  823. * the falling CS and the first rising SCK. This is a very
  824. * short time and doesn't require any additional delay
  825. * even on very fast CPUs.
  826. */
  827. (void)SciByte(VS_OPCODE_WRITE);
  828. (void)SciByte((uint8_t) reg);
  829. (void)SciByte((uint8_t) (data >> 8));
  830. (void)SciByte((uint8_t) data);
  831. /* Re-select data channel. */
  832. VsSciSelect(0);
  833. }
  834. /*
  835. * \brief Read from a register.
  836. *
  837. * Decoder interrupts must have been disabled before calling this function.
  838. *
  839. * \return Register contents.
  840. */
  841. static uint16_t VsRegRead(ureg_t reg)
  842. {
  843. uint16_t data;
  844. /* Select command channel. */
  845. VsWaitReady();
  846. VsSciSelect(1);
  847. (void)SciByte(VS_OPCODE_READ);
  848. (void)SciByte((uint8_t) reg);
  849. data = (uint16_t)SciByte(0) << 8;
  850. data |= SciByte(0);
  851. /* Select data channel. */
  852. VsSciSelect(0);
  853. return data;
  854. }
  855. /*
  856. * \brief Feed the decoder with data.
  857. *
  858. * This function serves two purposes:
  859. * - It is called by VsPlayerKick() to initially fill the decoder buffer.
  860. * - It is used as an interrupt handler for the decoder.
  861. */
  862. static void VsPlayerFeed(void *arg)
  863. {
  864. ureg_t j = 32;
  865. size_t total = 0;
  866. if (!VS10XX_DREQ_TST()) {
  867. return;
  868. }
  869. /*
  870. * Feed the decoder until its buffer is full or we ran out of data.
  871. */
  872. if (vs_status == VS_STATUS_RUNNING) {
  873. char *bp = 0;
  874. size_t consumed = 0;
  875. size_t available = 0;
  876. do {
  877. if(consumed >= available) {
  878. /* Commit previously consumed bytes. */
  879. if(consumed) {
  880. NutSegBufReadCommit(consumed);
  881. consumed = 0;
  882. }
  883. /* All bytes consumed, request new. */
  884. bp = NutSegBufReadRequest(&available);
  885. if(available == 0) {
  886. /* End of stream. */
  887. vs_status = VS_STATUS_EOF;
  888. break;
  889. }
  890. }
  891. /* We have some data in the buffer, feed it. */
  892. VsSdiPutByte(*bp);
  893. bp++;
  894. consumed++;
  895. total++;
  896. if (total > 4096) {
  897. vs_status = VS_STATUS_EOF;
  898. break;
  899. }
  900. /* Allow 32 bytes to be sent as long as DREQ is set, This includes
  901. the one in progress. */
  902. if (VS10XX_DREQ_TST()) {
  903. j = 32;
  904. }
  905. } while(j--);
  906. /* Finally re-enable the producer buffer. */
  907. NutSegBufReadLast(consumed);
  908. }
  909. /*
  910. * Flush the internal VS buffer.
  911. */
  912. if(vs_status != VS_STATUS_RUNNING && vs_flush) {
  913. do {
  914. VsSdiPutByte(0);
  915. if (--vs_flush == 0) {
  916. /* Decoder internal buffer is flushed. */
  917. vs_status = VS_STATUS_EMPTY;
  918. break;
  919. }
  920. /* Allow 32 bytes to be sent as long as DREQ is set, This includes
  921. the one in progress. */
  922. if (VS10XX_DREQ_TST()) {
  923. j = 32;
  924. }
  925. } while(j--);
  926. }
  927. }
  928. /*!
  929. * \brief Start playback.
  930. *
  931. * This routine will send the first MP3 data bytes to the
  932. * decoder, until it is completely filled. The data buffer
  933. * should have been filled before calling this routine.
  934. *
  935. * Decoder interrupts will be enabled.
  936. *
  937. * \return 0 on success, -1 otherwise.
  938. */
  939. int VsPlayerKick(void)
  940. {
  941. /*
  942. * Start feeding the decoder with data.
  943. */
  944. VsPlayerInterrupts(0);
  945. vs_status = VS_STATUS_RUNNING;
  946. VsPlayerFeed(NULL);
  947. VsPlayerInterrupts(1);
  948. return 0;
  949. }
  950. /*!
  951. * \brief Stops the playback.
  952. *
  953. * This routine will stops the MP3 playback, VsPlayerKick() may be used
  954. * to resume the playback.
  955. *
  956. * \return 0 on success, -1 otherwise.
  957. */
  958. int VsPlayerStop(void)
  959. {
  960. ureg_t ief;
  961. ief = VsPlayerInterrupts(0);
  962. /* Check whether we need to stop at all to not overwrite other than running status */
  963. if (vs_status == VS_STATUS_RUNNING) {
  964. vs_status = VS_STATUS_STOPPED;
  965. }
  966. VsPlayerInterrupts(ief);
  967. return 0;
  968. }
  969. /*!
  970. * \brief Sets up decoder internal buffer flushing.
  971. *
  972. * This routine will set up internal VS buffer flushing,
  973. * unless the buffer is already empty and starts the playback
  974. * if necessary. The internal VS buffer is flushed in VsPlayerFeed()
  975. * at the end of the stream.
  976. *
  977. * Decoder interrupts will be enabled.
  978. *
  979. * \return 0 on success, -1 otherwise.
  980. */
  981. int VsPlayerFlush(void)
  982. {
  983. VsPlayerInterrupts(0);
  984. /* Set up fluhing unless both buffers are empty. */
  985. if (vs_status != VS_STATUS_EMPTY || NutSegBufUsed()) {
  986. if (vs_flush == 0) {
  987. vs_flush = VS_FLUSH_BYTES;
  988. }
  989. /* start the playback if necessary */
  990. if (vs_status != VS_STATUS_RUNNING) {
  991. VsPlayerKick();
  992. }
  993. }
  994. VsPlayerInterrupts(1);
  995. return 0;
  996. }
  997. /*!
  998. * \brief Initialize the VS10XX hardware interface.
  999. *
  1000. * \return 0 on success, -1 otherwise.
  1001. */
  1002. int VsPlayerInit(void)
  1003. {
  1004. /* Disable decoder interrupts. */
  1005. VsPlayerInterrupts(0);
  1006. /* Keep decoder in reset state. */
  1007. SciReset(1);
  1008. /* Initialize command channel. */
  1009. if (SciSetMode()) {
  1010. return -1;
  1011. }
  1012. SciSetSpeed();
  1013. SciDeselect();
  1014. /* Initialize data channel. */
  1015. if (SdiSetMode()) {
  1016. return -1;
  1017. }
  1018. SdiSetSpeed();
  1019. SdiDeselect();
  1020. /* Set BSYNC output low. */
  1021. VS10XX_BSYNC_CLR();
  1022. VS10XX_BSYNC_ENA();
  1023. /* Set low active data channel select output low. */
  1024. VS10XX_XDCS_SET();
  1025. VS10XX_XDCS_ENA();
  1026. /* Set low active command channel select output high. */
  1027. VS10XX_XCS_SET();
  1028. VS10XX_XCS_ENA();
  1029. /* Enable DREQ interrupt input. */
  1030. VS10XX_DREQ_ENA();
  1031. /* Register the interrupt routine */
  1032. if (NutRegisterIrqHandler(&VS10XX_SIGNAL, VsPlayerFeed, NULL)) {
  1033. return -1;
  1034. }
  1035. /* Rising edge will generate an interrupt. */
  1036. NutIrqSetMode(&VS10XX_SIGNAL, NUT_IRQMODE_RISINGEDGE);
  1037. /* Release decoder reset line. */
  1038. SciReset(0);
  1039. NutDelay(VS10XX_HWRST_RECOVER);
  1040. return VsPlayerReset(0);
  1041. }
  1042. /*!
  1043. * \brief Software reset the decoder.
  1044. *
  1045. * This function is typically called after VsPlayerInit() and at the end
  1046. * of each track.
  1047. *
  1048. * \param mode Any of the following flags may be or'ed (check the data sheet)
  1049. * - \ref VS_SM_DIFF Left channel inverted.
  1050. * - \ref VS_SM_LAYER12 Allow MPEG layers I and II.
  1051. * - \ref VS_SM_MP12 Allow MPEG layers I and II on VS1001K.
  1052. * - \ref VS_SM_FFWD VS1001K fast forward.
  1053. * - \ref VS_SM_RESET Software reset.
  1054. * - \ref VS_SM_OUTOFWAV Jump out of WAV decoding.
  1055. * - \ref VS_SM_TESTS Allow SDI tests.
  1056. * - \ref VS_SM_PDOWN Switch to power down mode.
  1057. * - \ref VS_SM_BASS VS1001K bass/treble enhancer.
  1058. * - \ref VS_SM_STREAM Stream mode.
  1059. * - \ref VS_SM_SDISHARE Share SPI chip select.
  1060. * - \ref VS_SM_SDINEW VS1002 native mode (automatically set).
  1061. * - \ref VS_SM_ADPCM VS1033 ADPCM recording.
  1062. * - \ref VS_SM_ADPCM_HP VS1033 ADPCM high pass filter.
  1063. * - \ref VS_SM_LINE_IN VS1033 ADPCM recording selector.
  1064. * - \ref VS_SM_CLK_RANGE VS1033 input clock range.
  1065. *
  1066. * \return 0 on success, -1 otherwise.
  1067. */
  1068. int VsPlayerReset(uint16_t mode)
  1069. {
  1070. /* Disable decoder interrupts and feeding. */
  1071. VsPlayerInterrupts(0);
  1072. vs_status = VS_STATUS_STOPPED;
  1073. /* Software reset. */
  1074. VsRegWrite(VS_MODE_REG, VS_SM_RESET);
  1075. /* The decoder needs 9600 XTAL cycles. This is at least twice. */
  1076. NutDelay(VS10XX_SWRST_RECOVER);
  1077. /*
  1078. * Check for correct reset.
  1079. */
  1080. if ((mode & VS_SM_RESET) != 0 || !VS10XX_DREQ_TST()) {
  1081. /* If not succeeded, give it one more chance and try hw reset. */
  1082. SciReset(1);
  1083. /* No idea how long we must held reset low. */
  1084. NutDelay(VS10XX_HWRST_DURATION);
  1085. SciReset(0);
  1086. /* No idea how long we need to wait here. */
  1087. NutDelay(VS10XX_HWRST_RECOVER);
  1088. if (!VS10XX_DREQ_TST()) {
  1089. return -1;
  1090. }
  1091. }
  1092. /* Set codec mode. */
  1093. #if defined(VS10XX_BSYNC_BIT)
  1094. VsRegWrite(VS_MODE_REG, mode);
  1095. #else
  1096. VsRegWrite(VS_MODE_REG, VS_SM_SDINEW | mode);
  1097. #endif
  1098. #if VS10XX_FREQ < 20000000UL
  1099. VsRegWrite(VS_CLOCKF_REG, (uint16_t)(VS_CF_DOUBLER | (VS10XX_FREQ / 2000UL)));
  1100. #else
  1101. VsRegWrite(VS_CLOCKF_REG, (uint16_t)(VS10XX_FREQ / 2000UL));
  1102. #endif
  1103. #if defined(AUDIO_VS1001K)
  1104. /* Force frequency change (see datasheet). */
  1105. VsRegWrite(VS_INT_FCTLH_REG, 0x8008);
  1106. #endif
  1107. NutDelay(1);
  1108. #if defined(VS10XX_SDI_SPI0_DEVICE) || defined(VS10XX_SCI_SPI0_DEVICE)
  1109. /* Clear any spurious interrupts. */
  1110. outb(EIFR, BV(VS10XX_DREQ_BIT));
  1111. #endif
  1112. return 0;
  1113. }
  1114. /*!
  1115. * \brief Set mode register of the decoder.
  1116. *
  1117. * \param mode Any of the following flags may be or'ed (check the data sheet)
  1118. * - \ref VS_SM_DIFF Left channel inverted.
  1119. * - \ref VS_SM_LAYER12 Allow MPEG layers I and II.
  1120. * - \ref VS_SM_MP12 Allow MPEG layers I and II on VS1001K.
  1121. * - \ref VS_SM_FFWD VS1001K fast forward.
  1122. * - \ref VS_SM_RESET Software reset.
  1123. * - \ref VS_SM_OUTOFWAV Jump out of WAV decoding.
  1124. * - \ref VS_SM_TESTS Allow SDI tests.
  1125. * - \ref VS_SM_PDOWN Switch to power down mode.
  1126. * - \ref VS_SM_BASS VS1001K bass/treble enhancer.
  1127. * - \ref VS_SM_STREAM Stream mode.
  1128. * - \ref VS_SM_SDISHARE Share SPI chip select.
  1129. * - \ref VS_SM_SDINEW VS1002 native mode (automatically set).
  1130. * - \ref VS_SM_ADPCM VS1033 ADPCM recording.
  1131. * - \ref VS_SM_ADPCM_HP VS1033 ADPCM high pass filter.
  1132. * - \ref VS_SM_LINE_IN VS1033 ADPCM recording selector.
  1133. * - \ref VS_SM_CLK_RANGE VS1033 input clock range.
  1134. *
  1135. * \return Always 0.
  1136. */
  1137. int VsPlayerSetMode(uint16_t mode)
  1138. {
  1139. ureg_t ief;
  1140. ief = VsPlayerInterrupts(0);
  1141. #if defined(VS10XX_BSYNC_BIT)
  1142. VsRegWrite(VS_MODE_REG, mode);
  1143. #else
  1144. VsRegWrite(VS_MODE_REG, VS_SM_SDINEW | mode);
  1145. #endif
  1146. VsPlayerInterrupts(ief);
  1147. return 0;
  1148. }
  1149. /*!
  1150. * \brief Returns play time since last reset.
  1151. *
  1152. * \return Play time since reset in seconds
  1153. */
  1154. uint16_t VsPlayTime(void)
  1155. {
  1156. uint16_t rc;
  1157. ureg_t ief;
  1158. ief = VsPlayerInterrupts(0);
  1159. rc = VsRegRead(VS_DECODE_TIME_REG);
  1160. VsPlayerInterrupts(ief);
  1161. return rc;
  1162. }
  1163. /*!
  1164. * \brief Returns status of the player.
  1165. *
  1166. * \return Any of the following value:
  1167. * - VS_STATUS_STOPPED Player is ready to be started by VsPlayerKick().
  1168. * - VS_STATUS_RUNNING Player is running.
  1169. * - VS_STATUS_EOF Player has reached the end of a stream after VsPlayerFlush() has been called.
  1170. * - VS_STATUS_EMPTY Player runs out of data. VsPlayerKick() will restart it.
  1171. */
  1172. unsigned int VsGetStatus(void)
  1173. {
  1174. return vs_status;
  1175. }
  1176. #ifdef __GNUC__
  1177. /*!
  1178. * \brief Query MP3 stream header information.
  1179. *
  1180. * \param vshi Pointer to VS_HEADERINFO structure.
  1181. *
  1182. * \return 0 on success, -1 otherwise.
  1183. */
  1184. int VsGetHeaderInfo(VS_HEADERINFO * vshi)
  1185. {
  1186. uint16_t *usp = (uint16_t *) vshi;
  1187. ureg_t ief;
  1188. ief = VsPlayerInterrupts(0);
  1189. *usp = VsRegRead(VS_HDAT1_REG);
  1190. *++usp = VsRegRead(VS_HDAT0_REG);
  1191. VsPlayerInterrupts(ief);
  1192. return 0;
  1193. }
  1194. #endif
  1195. /*!
  1196. * \brief Initialize decoder memory test and return result.
  1197. *
  1198. * \return Memory test result.
  1199. * - Bit 0: Good X ROM
  1200. * - Bit 1: Good Y ROM (high)
  1201. * - Bit 2: Good Y ROM (low)
  1202. * - Bit 3: Good Y RAM
  1203. * - Bit 4: Good X RAM
  1204. * - Bit 5: Good Instruction RAM (high)
  1205. * - Bit 6: Good Instruction RAM (low)
  1206. */
  1207. uint16_t VsMemoryTest(void)
  1208. {
  1209. uint16_t rc;
  1210. ureg_t ief;
  1211. static const char mtcmd[] PROGMEM = { 0x4D, 0xEA, 0x6D, 0x54, 0x00, 0x00, 0x00, 0x00 };
  1212. ief = VsPlayerInterrupts(0);
  1213. #if defined(VS10XX_BSYNC_BIT)
  1214. VsRegWrite(VS_MODE_REG, VS_SM_TESTS);
  1215. #else
  1216. VsRegWrite(VS_MODE_REG, VS_SM_TESTS | VS_SM_SDINEW);
  1217. #endif
  1218. VsSdiWrite_P(mtcmd, sizeof(mtcmd));
  1219. while(((rc = VsRegRead(VS_HDAT0_REG)) & 0x8000) == 0) {
  1220. NutDelay(1);
  1221. }
  1222. #if defined(VS10XX_BSYNC_BIT)
  1223. VsRegWrite(VS_MODE_REG, 0);
  1224. #else
  1225. VsRegWrite(VS_MODE_REG, VS_SM_SDINEW);
  1226. #endif
  1227. VsPlayerInterrupts(ief);
  1228. return rc;
  1229. }
  1230. /*!
  1231. * \brief Set volume.
  1232. *
  1233. * \param left Left channel attenuation, provided in 0.5 dB steps.
  1234. * Set to 255 for ananlog power down.
  1235. * \param right Right channel attenuation.
  1236. *
  1237. * \return Always 0.
  1238. */
  1239. int VsSetVolume(ureg_t left, ureg_t right)
  1240. {
  1241. ureg_t ief;
  1242. ief = VsPlayerInterrupts(0);
  1243. VsRegWrite(VS_VOL_REG, ((uint16_t)left << VS_VOL_LEFT_LSB) | ((uint16_t)right << VS_VOL_RIGHT_LSB));
  1244. VsPlayerInterrupts(ief);
  1245. return 0;
  1246. }
  1247. /*!
  1248. * \brief Sine wave beep.
  1249. *
  1250. * \param fsin Frequency.
  1251. * \param ms Duration.
  1252. *
  1253. * \return Always 0.
  1254. */
  1255. int VsBeep(uint8_t fsin, uint8_t ms)
  1256. {
  1257. ureg_t ief;
  1258. static const char on[] PROGMEM = { 0x53, 0xEF, 0x6E };
  1259. static const char off[] PROGMEM = { 0x45, 0x78, 0x69, 0x74 };
  1260. static const char end[] PROGMEM = { 0x00, 0x00, 0x00, 0x00 };
  1261. /* Disable decoder interrupts. */
  1262. ief = VsPlayerInterrupts(0);
  1263. #if defined(VS10XX_BSYNC_BIT)
  1264. VsRegWrite(VS_MODE_REG, VS_SM_TESTS);
  1265. #else
  1266. VsRegWrite(VS_MODE_REG, VS_SM_TESTS | VS_SM_SDINEW);
  1267. #endif
  1268. fsin = 56 + (fsin & 7) * 9;
  1269. VsSdiWrite_P(on, sizeof(on));
  1270. VsSdiWrite(&fsin, 1);
  1271. VsSdiWrite_P(end, sizeof(end));
  1272. NutDelay(ms);
  1273. VsSdiWrite_P(off, sizeof(off));
  1274. VsSdiWrite_P(end, sizeof(end));
  1275. #if defined(VS10XX_BSYNC_BIT)
  1276. VsRegWrite(VS_MODE_REG, 0);
  1277. #else
  1278. VsRegWrite(VS_MODE_REG, VS_SM_SDINEW);
  1279. #endif
  1280. /* Restore decoder interrupt enable. */
  1281. VsPlayerInterrupts(ief);
  1282. return 0;
  1283. }
  1284. /*@}*/