dma.h
上传用户:lgb322
上传日期:2013-02-24
资源大小:30529k
文件大小:11k
源码类别:

嵌入式Linux

开发平台:

Unix_Linux

  1. /*
  2.  * linux/arch/arm/mach-s3c2410/dma.h
  3.  *
  4.  * Copyright (C) 2002 MIZI Research, Inc
  5.  *
  6.  * Author: Janghoon Lyu <nandy@mizi.com>
  7.  * Date  : $Date: 2002/05/29 08:53:03 $
  8.  *
  9.  * $Revision: 1.1.2.2 $
  10.  *
  11.  * History:
  12.  *
  13.  * 2002-05-28: Janghoon Lyu <nandy@mizi.com>
  14.  *    - copy from linux/arch/arm/mach-s3c2400
  15.  *
  16.  */
  17. /* DMA buffer struct */
  18. typedef struct dma_buf_s {
  19. int size; /* buffer size */
  20. dma_addr_t dma_start; /* starting DMA address */
  21. int ref; /* number of DMA references */
  22. void *id; /* to identify buffer from outside */
  23. int write; /* 1: buf to write , 0: but to read  */
  24. struct dma_buf_s *next; /* next buf to process */
  25. } dma_buf_t;
  26. /* DMA control register structure */
  27. typedef struct {
  28. volatile u_long DISRC;
  29. volatile u_long DISRCC;
  30. volatile u_long DIDST;
  31. volatile u_long DIDSTC;
  32. volatile u_long DCON;
  33. volatile u_long DSTAT;
  34. volatile u_long DCSRC;
  35. volatile u_long DCDST;
  36. volatile u_long DMASKTRIG;
  37. } dma_regs_t;
  38. /* DMA device structre */
  39. typedef struct {
  40. dma_callback_t callback;
  41. u_long dst;
  42. u_long src;
  43. u_long ctl;
  44. u_long dst_ctl;
  45. u_long src_ctl;
  46. } dma_device_t;
  47. /* DMA channel structure */
  48. typedef struct {
  49. dmach_t channel;
  50. unsigned int in_use; /* Device is allocated */
  51. const char *device_id; /* Device name */
  52. dma_buf_t *head; /* where to insert buffers */
  53. dma_buf_t *tail; /* where to remove buffers */
  54. dma_buf_t *curr; /* buffer currently DMA'ed */
  55. unsigned long queue_count; /* number of buffers in the queue */
  56. int active; /* 1 if DMA is actually processing data */
  57. dma_regs_t *regs; /* points to appropriate DMA registers */
  58. int irq; /* IRQ used by the channel */
  59. dma_device_t write; /* to write */
  60. dma_device_t read; /* to read */
  61. } s3c2410_dma_t;
  62. s3c2410_dma_t dma_chan[MAX_S3C2410_DMA_CHANNELS];
  63. /* 阿 叼官捞胶狼 汲沥 蔼甸 */
  64. typedef struct {
  65. const char *name;
  66. u_long write_src;
  67. u_long write_dst;
  68. u_long write_ctl;
  69. u_long write_src_ctl;
  70. u_long write_dst_ctl;
  71. u_long read_src;
  72. u_long read_dst;
  73. u_long read_ctl;
  74. u_long read_src_ctl;
  75. u_long read_dst_ctl;
  76. } dma_type_t;
  77. #define DMA_UNDEF 0xffffffff /* not available */
  78. #define BUF_ON_MEM (ON_AHB | ADDR_INC)
  79. #define BUF_ON_APB (ON_APB | ADDR_FIX)
  80. #define UART0_MEM 0x0
  81. #define UART0_CTL (HS_MODE | SYNC_PCLK | INT_MODE | TSZ_UNIT | 
  82.  SINGLE_SERVICE | HWSRC(CH0_UART0) | DMA_SRC_HW | 
  83.  CLR_ATRELOAD | DSZ(DSZ_BYTE) | TX_CNT(0))
  84. #define UART0_WR_SRC UART0_MEM
  85. #define UART0_WR_DST 0x50000020 /* UTXH0 */
  86. #define UART0_WR_CTL UART0_CTL
  87. #define UART0_RD_SRC 0x50000024 /* URXH0 */
  88. #define UART0_RD_DST UART0_MEM
  89. #define UART0_RD_CTL UART0_CTL
  90. #define UART0_WR_SRC_CTL BUF_ON_MEM
  91. #define UART0_WR_DST_CTL BUF_ON_APB
  92. #define UART0_RD_SRC_CTL BUF_ON_APB
  93. #define UART0_RD_DST_CTL BUF_ON_MEM
  94. #define UART1_WR_SRC DMA_UNDEF
  95. #define UART1_WR_DST DMA_UNDEF
  96. #define UART1_WR_CTL DMA_UNDEF
  97. #define UART1_RD_SRC DMA_UNDEF
  98. #define UART1_RD_DST DMA_UNDEF
  99. #define UART1_RD_CTL DMA_UNDEF
  100. #define UART1_WR_SRC_CTL DMA_UNDEF
  101. #define UART1_WR_DST_CTL DMA_UNDEF
  102. #define UART1_RD_SRC_CTL DMA_UNDEF
  103. #define UART1_RD_DST_CTL DMA_UNDEF
  104. #define UART2_WR_SRC DMA_UNDEF
  105. #define UART2_WR_DST DMA_UNDEF
  106. #define UART2_WR_CTL DMA_UNDEF
  107. #define UART2_RD_SRC DMA_UNDEF
  108. #define UART2_RD_DST DMA_UNDEF
  109. #define UART2_RD_CTL DMA_UNDEF
  110. #define UART2_WR_SRC_CTL DMA_UNDEF
  111. #define UART2_WR_DST_CTL DMA_UNDEF
  112. #define UART2_RD_SRC_CTL DMA_UNDEF
  113. #define UART2_RD_DST_CTL DMA_UNDEF
  114. #define I2SSDO_CTL (HS_MODE | SYNC_PCLK | INT_MODE | TSZ_UNIT |  
  115. SINGLE_SERVICE | HWSRC(CH2_I2SSDO) | DMA_SRC_HW | 
  116. CLR_ATRELOAD | DSZ(DSZ_HALFWORD) | TX_CNT(0))
  117. #define I2SSDI_CTL              (HS_MODE | SYNC_PCLK | INT_MODE | TSZ_UNIT | 
  118.                                  SINGLE_SERVICE | HWSRC(CH1_I2SSDI) | DMA_SRC_HW | 
  119.                                  CLR_ATRELOAD | DSZ(DSZ_HALFWORD) | TX_CNT(0))
  120.                 
  121. #define I2SSDO_WR_SRC 0x0
  122. #define I2SSDO_WR_DST 0x55000010
  123. #define I2SSDO_WR_CTL I2SSDO_CTL
  124. #define I2SSDO_RD_SRC DMA_UNDEF
  125. #define I2SSDO_RD_DST DMA_UNDEF
  126. #define I2SSDO_RD_CTL DMA_UNDEF
  127. #define I2SSDO_WR_SRC_CTL BUF_ON_MEM
  128. #define I2SSDO_WR_DST_CTL BUF_ON_APB
  129. #define I2SSDO_RD_SRC_CTL DMA_UNDEF
  130. #define I2SSDO_RD_DST_CTL DMA_UNDEF
  131. #define I2SSDI_WR_SRC           DMA_UNDEF
  132. #define I2SSDI_WR_DST           DMA_UNDEF
  133. #define I2SSDI_WR_CTL           DMA_UNDEF
  134. #define I2SSDI_RD_SRC           0x55000010             
  135. #define I2SSDI_RD_DST           0x2        
  136. #define I2SSDI_RD_CTL           I2SSDI_CTL
  137. #define I2SSDI_WR_SRC_CTL       DMA_UNDEF               
  138. #define I2SSDI_WR_DST_CTL       DMA_UNDEF
  139. #define I2SSDI_RD_SRC_CTL       BUF_ON_APB
  140. #define I2SSDI_RD_DST_CTL       BUF_ON_MEM 
  141. #define USB_WR_SRC DMA_UNDEF
  142. #define USB_WR_DST DMA_UNDEF
  143. #define USB_WR_CTL DMA_UNDEF
  144. #define USB_RD_SRC DMA_UNDEF
  145. #define USB_RD_DST DMA_UNDEF
  146. #define USB_RD_CTL DMA_UNDEF
  147. #define USB_WR_SRC_CTL DMA_UNDEF
  148. #define USB_WR_DST_CTL DMA_UNDEF
  149. #define USB_RD_SRC_CTL DMA_UNDEF
  150. #define USB_RD_DST_CTL DMA_UNDEF
  151. #define MMC_WR_SRC DMA_UNDEF
  152. #define MMC_WR_DST DMA_UNDEF
  153. #define MMC_WR_CTL DMA_UNDEF
  154. #define MMC_RD_SRC DMA_UNDEF
  155. #define MMC_RD_DST DMA_UNDEF
  156. #define MMC_RD_CTL DMA_UNDEF
  157. #define MMC_WR_SRC_CTL DMA_UNDEF
  158. #define MMC_WR_DST_CTL DMA_UNDEF
  159. #define MMC_RD_SRC_CTL DMA_UNDEF
  160. #define MMC_RD_DST_CTL DMA_UNDEF
  161. #define SPI_WR_SRC DMA_UNDEF
  162. #define SPI_WR_DST DMA_UNDEF
  163. #define SPI_WR_CTL DMA_UNDEF
  164. #define SPI_RD_SRC DMA_UNDEF
  165. #define SPI_RD_DST DMA_UNDEF
  166. #define SPI_RD_CTL DMA_UNDEF
  167. #define SPI_WR_SRC_CTL DMA_UNDEF
  168. #define SPI_WR_DST_CTL DMA_UNDEF
  169. #define SPI_RD_SRC_CTL DMA_UNDEF
  170. #define SPI_RD_DST_CTL DMA_UNDEF
  171. #define TIMER_WR_SRC DMA_UNDEF
  172. #define TIMER_WR_DST DMA_UNDEF
  173. #define TIMER_WR_CTL DMA_UNDEF
  174. #define TIMER_RD_SRC DMA_UNDEF
  175. #define TIMER_RD_DST DMA_UNDEF
  176. #define TIMER_RD_CTL DMA_UNDEF
  177. #define TIMER_WR_SRC_CTL DMA_UNDEF
  178. #define TIMER_WR_DST_CTL DMA_UNDEF
  179. #define TIMER_RD_SRC_CTL DMA_UNDEF
  180. #define TIMER_RD_DST_CTL DMA_UNDEF
  181. #define XDREQ0_WR_SRC DMA_UNDEF
  182. #define XDREQ0_WR_DST DMA_UNDEF
  183. #define XDREQ0_WR_CTL DMA_UNDEF
  184. #define XDREQ0_RD_SRC DMA_UNDEF
  185. #define XDREQ0_RD_DST DMA_UNDEF
  186. #define XDREQ0_RD_CTL DMA_UNDEF
  187. #define XDREQ0_WR_SRC_CTL DMA_UNDEF
  188. #define XDREQ0_WR_DST_CTL DMA_UNDEF
  189. #define XDREQ0_RD_SRC_CTL DMA_UNDEF
  190. #define XDREQ0_RD_DST_CTL DMA_UNDEF
  191. #define XDREQ1_WR_SRC DMA_UNDEF
  192. #define XDREQ1_WR_DST DMA_UNDEF
  193. #define XDREQ1_WR_CTL DMA_UNDEF
  194. #define XDREQ1_RD_SRC DMA_UNDEF
  195. #define XDREQ1_RD_DST DMA_UNDEF
  196. #define XDREQ1_RD_CTL DMA_UNDEF
  197. #define XDREQ1_WR_SRC_CTL DMA_UNDEF
  198. #define XDREQ1_WR_DST_CTL DMA_UNDEF
  199. #define XDREQ1_RD_SRC_CTL DMA_UNDEF
  200. #define XDREQ1_RD_DST_CTL DMA_UNDEF
  201. static dma_type_t dma_types[4][5] = {
  202. {
  203. { "XDREQ0", XDREQ0_WR_SRC, XDREQ0_WR_DST, XDREQ0_WR_CTL, 
  204.     XDREQ0_WR_SRC_CTL, XDREQ0_WR_DST_CTL, 
  205.     XDREQ0_RD_SRC, XDREQ0_RD_DST, XDREQ0_RD_CTL, 
  206.     XDREQ0_RD_SRC_CTL, XDREQ0_RD_DST_CTL },
  207. { "UART0",  UART0_WR_SRC, UART0_WR_DST, UART0_WR_CTL, 
  208.     UART0_WR_SRC_CTL, UART0_WR_DST_CTL, 
  209.     UART0_RD_SRC, UART0_RD_DST, UART0_RD_CTL, 
  210.     UART0_RD_SRC_CTL, UART0_RD_DST_CTL },
  211. { "MMC",    MMC_WR_SRC, MMC_WR_DST, MMC_WR_CTL, 
  212.     MMC_WR_SRC_CTL, MMC_WR_DST_CTL, 
  213.     MMC_RD_SRC, MMC_RD_SRC, MMC_RD_CTL, 
  214.     MMC_RD_SRC_CTL, MMC_RD_DST_CTL },
  215. { "TIMER",  TIMER_WR_SRC, TIMER_WR_DST, TIMER_WR_CTL, 
  216.     TIMER_WR_SRC_CTL, TIMER_WR_DST_CTL, 
  217.     TIMER_RD_SRC, TIMER_RD_DST, TIMER_RD_CTL, 
  218.     TIMER_RD_SRC_CTL, TIMER_RD_DST_CTL },
  219. { "USB",    USB_WR_SRC, USB_WR_DST, USB_WR_CTL, 
  220.     USB_WR_SRC_CTL, USB_WR_DST_CTL, 
  221.     USB_RD_SRC, USB_RD_DST, USB_RD_CTL, 
  222.     USB_RD_SRC_CTL, USB_RD_DST_CTL }
  223. },
  224. {
  225. { "XDREQ1", XDREQ1_WR_SRC, XDREQ1_WR_DST, XDREQ1_WR_CTL, 
  226.     XDREQ1_WR_SRC_CTL, XDREQ1_WR_DST_CTL, 
  227.     XDREQ1_RD_SRC, XDREQ1_RD_DST, XDREQ1_RD_CTL, 
  228.     XDREQ1_RD_SRC_CTL, XDREQ1_RD_DST_CTL },
  229. { "UART1",  UART1_WR_SRC, UART1_WR_DST, UART1_WR_CTL, 
  230.     UART1_WR_SRC_CTL, UART1_WR_DST_CTL, 
  231.     UART1_RD_SRC, UART1_RD_DST, UART1_RD_CTL, 
  232.     UART1_RD_SRC_CTL, UART1_RD_DST_CTL },
  233. { "I2SSDI", I2SSDI_WR_SRC, I2SSDI_WR_DST, I2SSDI_WR_CTL, 
  234.     I2SSDI_WR_SRC_CTL, I2SSDI_WR_DST_CTL, 
  235.     I2SSDI_RD_SRC, I2SSDI_RD_DST, I2SSDI_RD_CTL, 
  236.     I2SSDI_RD_SRC_CTL, I2SSDI_RD_DST_CTL },
  237. { "SPI",    SPI_WR_SRC, SPI_WR_DST, SPI_WR_CTL, 
  238.     SPI_WR_SRC_CTL, SPI_WR_DST_CTL, 
  239.     SPI_RD_SRC, SPI_RD_DST, SPI_WR_CTL, 
  240.     SPI_RD_SRC_CTL, SPI_RD_DST_CTL },
  241. { "USB",    USB_WR_SRC, USB_WR_DST, USB_WR_CTL, 
  242.     USB_WR_SRC_CTL, USB_WR_DST_CTL, 
  243.     USB_RD_SRC, USB_RD_DST, USB_RD_CTL, 
  244.     USB_RD_SRC_CTL, USB_RD_DST_CTL }
  245. },
  246. {
  247. { "I2SSDO", I2SSDO_WR_SRC, I2SSDO_WR_DST, I2SSDO_WR_CTL, 
  248.     I2SSDO_WR_SRC_CTL, I2SSDO_WR_DST_CTL, 
  249.     I2SSDO_RD_SRC, I2SSDO_RD_DST, I2SSDO_RD_CTL, 
  250.     I2SSDO_RD_SRC_CTL, I2SSDO_RD_DST_CTL },
  251. { "I2SSDI", I2SSDI_WR_SRC, I2SSDI_WR_DST, I2SSDI_WR_CTL, 
  252.     I2SSDI_WR_SRC_CTL, I2SSDI_WR_DST_CTL, 
  253.     I2SSDI_RD_SRC, I2SSDI_RD_DST, I2SSDI_RD_CTL, 
  254.     I2SSDI_RD_SRC_CTL, I2SSDI_RD_DST_CTL },
  255. { "MMC",    MMC_WR_SRC, MMC_WR_DST, MMC_WR_CTL, 
  256.     MMC_WR_SRC_CTL, MMC_WR_DST_CTL, 
  257.     MMC_RD_SRC, MMC_RD_SRC, MMC_RD_CTL, 
  258.     MMC_RD_SRC_CTL, MMC_RD_DST_CTL },
  259. { "TIMER",  TIMER_WR_SRC, TIMER_WR_DST, TIMER_WR_CTL, 
  260.     TIMER_WR_SRC_CTL, TIMER_WR_DST_CTL, 
  261.     TIMER_RD_SRC, TIMER_RD_DST, TIMER_RD_CTL, 
  262.     TIMER_RD_SRC_CTL, TIMER_RD_DST_CTL },
  263. { "USB",    USB_WR_SRC, USB_WR_DST, USB_WR_CTL, 
  264.     USB_WR_SRC_CTL, USB_WR_DST_CTL, 
  265.     USB_RD_SRC, USB_RD_DST, USB_RD_CTL, 
  266.     USB_RD_SRC_CTL, USB_RD_DST_CTL }
  267. },
  268. {
  269. { "UART2",  UART2_WR_SRC, UART2_WR_DST, UART2_WR_CTL, 
  270.     UART2_WR_SRC_CTL, UART2_WR_DST_CTL, 
  271.     UART2_RD_SRC, UART2_RD_DST, UART2_RD_CTL, 
  272.     UART2_RD_SRC_CTL, UART2_RD_DST_CTL },
  273. { "MMC",    MMC_WR_SRC, MMC_WR_DST, MMC_WR_CTL, 
  274.     MMC_WR_SRC_CTL, MMC_WR_DST_CTL, 
  275.     MMC_RD_SRC, MMC_RD_SRC, MMC_RD_CTL, 
  276.     MMC_RD_SRC_CTL, MMC_RD_DST_CTL },
  277. { "SPI",    SPI_WR_SRC, SPI_WR_DST, SPI_WR_CTL, 
  278.     SPI_WR_SRC_CTL, SPI_WR_DST_CTL, 
  279.     SPI_RD_SRC, SPI_RD_DST, SPI_WR_CTL, 
  280.     SPI_RD_SRC_CTL, SPI_RD_DST_CTL },
  281. { "TIMER",  TIMER_WR_SRC, TIMER_WR_DST, TIMER_WR_CTL, 
  282.     TIMER_WR_SRC_CTL, TIMER_WR_DST_CTL, 
  283.     TIMER_RD_SRC, TIMER_RD_DST, TIMER_RD_CTL, 
  284.     TIMER_RD_SRC_CTL, TIMER_RD_DST_CTL },
  285. { "USB",    USB_WR_SRC, USB_WR_DST, USB_WR_CTL, 
  286.     USB_WR_SRC_CTL, USB_WR_DST_CTL, 
  287.     USB_RD_SRC, USB_RD_DST, USB_RD_CTL, 
  288.     USB_RD_SRC_CTL, USB_RD_DST_CTL }
  289. }
  290. };
  291. #if !defined(CONFIG_S3C2410_MPORT3) && !defined(CONFIG_S3C2410_MPORT1)
  292. /* FIXME:
  293.  * 恐 TCON汲沥阑 捞犯霸 秦具 瞪鳖夸? 
  294.  * TCON |= (TIMER3_ATLOAD_ON | TIMER3_ON | TIMER3_NOP);
  295.  * 扼绰 疙飞绢 力措肺 冈囚甸瘤 臼嚼聪促. 历狼 阂蔓牢单....
  296.  * S3C2410.h俊 沥狼登绢 乐绰 郴侩苞 包访捞 乐阑 巴 鞍嚼聪促.
  297.  */
  298. /*
  299.  * TCNTB3 绰 窍靛内爹 沁嚼聪促. 咯扁辑 傈力 炼扒篮 TIMER 4甫
  300.  * 荤侩窍扁 困秦辑 linux/include/asm-arm/arch-s3c2410/time.h俊辑
  301.  * TIMER 3俊 包访等 悸泼捞 捞固 登绢 乐绢具 等促绰 巴涝聪促.
  302.  */
  303. #define HOOK_LOST_INT
  304. #ifdef HOOK_LOST_INT
  305. #define stop_dma_timer() ({ TCON |= TIMER3_OFF; })
  306. #define start_dma_timer() 
  307. ({ TCNTB3 = 15626;  /* less than 10ms */  
  308.    TCON = (TCON | TIMER3_MANUP | TIMER3_OFF); 
  309.    TCON = (TCON | TIMER3_ATLOAD_ON | TIMER3_ON | TIMER3_NOP); })
  310. #endif
  311. #endif /* nCONFIG_S3C2410_MPORT3 */