vidc_fill.S
上传用户:jlfgdled
上传日期:2013-04-10
资源大小:33168k
文件大小:5k
源码类别:

Linux/Unix编程

开发平台:

Unix_Linux

  1. /*
  2.  *  linux/drivers/sound/vidc_fill.S
  3.  *
  4.  *  Copyright (C) 1997 Russell King
  5.  *
  6.  * This program is free software; you can redistribute it and/or modify
  7.  * it under the terms of the GNU General Public License version 2 as
  8.  * published by the Free Software Foundation.
  9.  *
  10.  *  Filler routines for DMA buffers
  11.  */
  12. #define __ASSEMBLY__
  13. #include <linux/linkage.h>
  14. #include <asm/assembler.h>
  15. #include <asm/hardware.h>
  16. #include <asm/hardware/iomd.h>
  17. .text
  18. ENTRY(vidc_fill_1x8_u)
  19. mov ip, #0xff00
  20. 1: cmp r0, r1
  21. bge SYMBOL_NAME(vidc_clear)
  22. ldrb r4, [r0], #1
  23. eor r4, r4, #0x80
  24. and r4, ip, r4, lsl #8
  25. orr r4, r4, r4, lsl #16
  26. str r4, [r2], #4
  27. cmp r2, r3
  28. blt 1b
  29. mov pc, lr
  30. ENTRY(vidc_fill_2x8_u)
  31. mov ip, #0xff00
  32. 1: cmp r0, r1
  33. bge SYMBOL_NAME(vidc_clear)
  34. ldr r4, [r0], #2
  35. and r5, r4, ip
  36. and r4, ip, r4, lsl #8
  37. orr r4, r4, r5, lsl #16
  38. orr r4, r4, r4, lsr #8
  39. str r4, [r2], #4
  40. cmp r2, r3
  41. blt 1b
  42. mov pc, lr
  43. ENTRY(vidc_fill_1x8_s)
  44. mov ip, #0xff00
  45. 1: cmp r0, r1
  46. bge SYMBOL_NAME(vidc_clear)
  47. ldrb r4, [r0], #1
  48. and r4, ip, r4, lsl #8
  49. orr r4, r4, r4, lsl #16
  50. str r4, [r2], #4
  51. cmp r2, r3
  52. blt 1b
  53. mov pc, lr
  54. ENTRY(vidc_fill_2x8_s)
  55. mov ip, #0xff00
  56. 1: cmp r0, r1
  57. bge SYMBOL_NAME(vidc_clear)
  58. ldr r4, [r0], #2
  59. and r5, r4, ip
  60. and r4, ip, r4, lsl #8
  61. orr r4, r4, r5, lsl #16
  62. orr r4, r4, r4, lsr #8
  63. str r4, [r2], #4
  64. cmp r2, r3
  65. blt 1b
  66. mov pc, lr
  67. ENTRY(vidc_fill_1x16_s)
  68. mov ip, #0xff00
  69. orr ip, ip, ip, lsr #8
  70. 1: cmp r0, r1
  71. bge SYMBOL_NAME(vidc_clear)
  72. ldr r5, [r0], #2
  73. and r4, r5, ip
  74. orr r4, r4, r4, lsl #16
  75. str r4, [r2], #4
  76. cmp r0, r1
  77. addlt r0, r0, #2
  78. andlt r4, r5, ip, lsl #16
  79. orrlt r4, r4, r4, lsr #16
  80. strlt r4, [r2], #4
  81. cmp r2, r3
  82. blt 1b
  83. mov pc, lr
  84. ENTRY(vidc_fill_2x16_s)
  85. mov ip, #0xff00
  86. orr ip, ip, ip, lsr #8
  87. 1: cmp r0, r1
  88. bge SYMBOL_NAME(vidc_clear)
  89. ldr r4, [r0], #4
  90. str r4, [r2], #4
  91. cmp r0, r1
  92. ldrlt r4, [r0], #4
  93. strlt r4, [r2], #4
  94. cmp r2, r3
  95. blt 1b
  96. mov pc, lr
  97. ENTRY(vidc_fill_noaudio)
  98. mov r0, #0
  99. mov r1, #0
  100. 2: mov r4, #0
  101. mov r5, #0
  102. 1: cmp r2, r3
  103. stmltia r2!, {r0, r1, r4, r5}
  104. blt 1b
  105. mov pc, lr
  106. ENTRY(vidc_clear)
  107. mov r0, #0
  108. mov r1, #0
  109. tst r2, #4
  110. str r0, [r2], #4
  111. tst r2, #8
  112. stmia r2!, {r0, r1}
  113. b 2b
  114. /*
  115.  * Call filler routines with:
  116.  *  r0 = phys address
  117.  *  r1 = phys end
  118.  *  r2 = buffer
  119.  * Returns:
  120.  *  r0 = new buffer address
  121.  *  r2 = new buffer finish
  122.  *  r4 = corrupted
  123.  *  r5 = corrupted
  124.  *  ip = corrupted
  125.  */
  126. ENTRY(vidc_sound_dma_irq)
  127. stmfd sp!, {r4 - r8, lr}
  128. ldr r8, =SYMBOL_NAME(dma_start)
  129. ldmia r8, {r0, r1, r2, r3, r4, r5}
  130. teq r1, #0
  131. adreq r4, SYMBOL_NAME(vidc_fill_noaudio)
  132. moveq r7, #1 << 31
  133. movne r7, #0
  134. mov ip, #IOMD_BASE & 0xff000000
  135. orr ip, ip, #IOMD_BASE & 0x00ff0000
  136. ldrb r6, [ip, #IOMD_SD0ST]
  137. tst r6, #DMA_ST_OFL @ Check for overrun
  138. eorne r6, r6, #DMA_ST_AB
  139. tst r6, #DMA_ST_AB
  140. moveq r2, r3 @ DMAing A, update B
  141. add r3, r2, r5 @ End of DMA buffer
  142. add r1, r1, r0 @ End of virtual DMA buffer
  143. mov lr, pc
  144. mov pc, r4 @ Call fill routine (uses r4, ip)
  145. sub r1, r1, r0 @ Remaining length
  146. stmia r8, {r0, r1}
  147. mov r0, #0
  148. tst r2, #4 @ Round buffer up to 4 words
  149. strne r0, [r2], #4
  150. tst r2, #8
  151. strne r0, [r2], #4
  152. strne r0, [r2], #4
  153. sub r2, r2, #16
  154. mov r2, r2, lsl #20
  155. movs r2, r2, lsr #20
  156. orreq r2, r2, #1 << 30 @ Set L bit
  157. orr r2, r2, r7
  158. ldmdb r8, {r3, r4, r5}
  159. tst r6, #DMA_ST_AB
  160. mov ip, #IOMD_BASE & 0xff000000
  161. orr ip, ip, #IOMD_BASE & 0x00ff0000
  162. streq r4, [ip, #IOMD_SD0CURB]
  163. strne r5, [ip, #IOMD_SD0CURA]
  164. streq r2, [ip, #IOMD_SD0ENDB]
  165. strne r2, [ip, #IOMD_SD0ENDA]
  166. ldr lr, [ip, #IOMD_SD0ST]
  167. tst lr, #DMA_ST_OFL
  168. bne 1f
  169. tst r6, #DMA_ST_AB
  170. strne r4, [ip, #IOMD_SD0CURB]
  171. streq r5, [ip, #IOMD_SD0CURA]
  172. strne r2, [ip, #IOMD_SD0ENDB]
  173. streq r2, [ip, #IOMD_SD0ENDA]
  174. 1: teq r7, #0
  175. mov r0, #0x10
  176. strneb r0, [ip, #IOMD_SD0CR]
  177. ldmfd sp!, {r4 - r8, lr}
  178. teq r1, #0 @ If we have no more
  179. movne pc, lr
  180. teq r3, #0
  181. movne pc, r3 @ Call interrupt routine
  182. mov pc, lr
  183. .data
  184. .globl SYMBOL_NAME(dma_interrupt)
  185. SYMBOL_NAME(dma_interrupt):
  186. .long 0 @ r3
  187. .globl SYMBOL_NAME(dma_pbuf)
  188. SYMBOL_NAME(dma_pbuf):
  189. .long 0 @ r4
  190. .long 0 @ r5
  191. .globl SYMBOL_NAME(dma_start)
  192. SYMBOL_NAME(dma_start):
  193. .long 0 @ r0
  194. .globl SYMBOL_NAME(dma_count)
  195. SYMBOL_NAME(dma_count):
  196. .long 0 @ r1
  197. .globl SYMBOL_NAME(dma_buf)
  198. SYMBOL_NAME(dma_buf):
  199. .long 0 @ r2
  200. .long 0 @ r3
  201. .globl SYMBOL_NAME(vidc_filler)
  202. SYMBOL_NAME(vidc_filler):
  203. .long SYMBOL_NAME(vidc_fill_noaudio) @ r4
  204. .globl SYMBOL_NAME(dma_bufsize)
  205. SYMBOL_NAME(dma_bufsize):
  206. .long 0x1000 @ r5