1 /******************************************************************************************************************************************
2 * 文件名称: SWM341_dma2d.c
3 * 功能说明: SWM341单片机的DMA2D功能驱动库
4 * 技术支持: http://www.synwit.com.cn/e/tool/gbook/?bid=1
5 * 注意事项:
6 * 版本日期: V1.0.0      2016年1月30日
7 * 升级记录:
8 *
9 *
10 *******************************************************************************************************************************************
11 * @attention
12 *
13 * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS WITH CODING INFORMATION
14 * REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE TIME. AS A RESULT, SYNWIT SHALL NOT BE HELD LIABLE
15 * FOR ANY DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING FROM THE CONTENT
16 * OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE CODING INFORMATION CONTAINED HEREIN IN CONN-
17 * -ECTION WITH THEIR PRODUCTS.
18 *
19 * COPYRIGHT 2012 Synwit Technology
20 *******************************************************************************************************************************************/
21 #include "SWM341.h"
22 #include "SWM341_dma2d.h"
23 
24 
25 /******************************************************************************************************************************************
26 * 函数名称: DMA2D_Init()
27 * 功能说明: DMA2D初始化
28 * 输    入: DMA2D_InitStructure * initStruct
29 * 输    出: 无
30 * 注意事项: 无
31 ******************************************************************************************************************************************/
DMA2D_Init(DMA2D_InitStructure * initStruct)32 void DMA2D_Init(DMA2D_InitStructure * initStruct)
33 {
34     SYS->CLKEN0 |= (1 << SYS_CLKEN0_DMA2D_Pos);
35 
36     DMA2D->CR &= ~DMA2D_CR_WAIT_Msk;
37     DMA2D->CR |= (initStruct->Interval << DMA2D_CR_WAIT_Pos);
38 
39     DMA2D->IF = 0xFF;
40     DMA2D->IE = (initStruct->IntEOTEn << DMA2D_IE_DONE_Pos);
41 
42     if(initStruct->IntEOTEn)
43         NVIC_EnableIRQ(DMA2D_IRQn);
44 }
45 
46 
47 /******************************************************************************************************************************************
48 * 函数名称: DMA2D_PixelFill()
49 * 功能说明: DMA2D向指定存储器区域填充指定颜色
50 * 输    入: DMA2D_LayerSetting * outLayer 要填充的位置、大小、颜色格式等
51 *           uint32_t color                  要填充的颜色
52 * 输    出: 无
53 * 注意事项: 无
54 ******************************************************************************************************************************************/
DMA2D_PixelFill(DMA2D_LayerSetting * outLayer,uint32_t color)55 void DMA2D_PixelFill(DMA2D_LayerSetting * outLayer, uint32_t color)
56 {
57     DMA2D->L[DMA2D_LAYER_OUT].COLOR = color;
58 
59     DMA2D->L[DMA2D_LAYER_OUT].MAR = outLayer->Address;
60     DMA2D->L[DMA2D_LAYER_OUT].OR  = outLayer->LineOffset;
61     DMA2D->L[DMA2D_LAYER_OUT].PFCCR = (outLayer->ColorMode << DMA2D_PFCCR_CFMT_Pos);
62 
63     DMA2D->NLR = ((outLayer->LineCount - 1) << DMA2D_NLR_NLINE_Pos) |
64                  ((outLayer->LinePixel - 1) << DMA2D_NLR_NPIXEL_Pos);
65 
66     DMA2D->CR &= ~DMA2D_CR_MODE_Msk;
67     DMA2D->CR |= (3 << DMA2D_CR_MODE_Pos) |
68                  (1 << DMA2D_CR_START_Pos);
69 }
70 
71 
72 /******************************************************************************************************************************************
73 * 函数名称: DMA2D_PixelMove()
74 * 功能说明: DMA2D像素数据搬运
75 * 输    入: DMA2D_LayerSetting * fgLayer
76 *           DMA2D_LayerSetting * outLayer
77 * 输    出: 无
78 * 注意事项: 无
79 ******************************************************************************************************************************************/
DMA2D_PixelMove(DMA2D_LayerSetting * fgLayer,DMA2D_LayerSetting * outLayer)80 void DMA2D_PixelMove(DMA2D_LayerSetting * fgLayer, DMA2D_LayerSetting * outLayer)
81 {
82     DMA2D->L[DMA2D_LAYER_FG].MAR = fgLayer->Address;
83     DMA2D->L[DMA2D_LAYER_FG].OR  = fgLayer->LineOffset;
84     DMA2D->L[DMA2D_LAYER_FG].PFCCR = (fgLayer->ColorMode << DMA2D_PFCCR_CFMT_Pos);
85 
86     DMA2D->L[DMA2D_LAYER_OUT].MAR = outLayer->Address;
87     DMA2D->L[DMA2D_LAYER_OUT].OR  = outLayer->LineOffset;
88 
89     DMA2D->NLR = ((outLayer->LineCount - 1) << DMA2D_NLR_NLINE_Pos) |
90                  ((outLayer->LinePixel - 1) << DMA2D_NLR_NPIXEL_Pos);
91 
92     DMA2D->CR &= ~DMA2D_CR_MODE_Msk;
93     DMA2D->CR |= (0 << DMA2D_CR_MODE_Pos) |
94                  (1 << DMA2D_CR_START_Pos);
95 }
96 
97 
98 /******************************************************************************************************************************************
99 * 函数名称: DMA2D_PixelConvert()
100 * 功能说明: DMA2D像素转换
101 * 输    入: DMA2D_LayerSetting * fgLayer
102 *           DMA2D_LayerSetting * outLayer
103 * 输    出: 无
104 * 注意事项: 无
105 ******************************************************************************************************************************************/
DMA2D_PixelConvert(DMA2D_LayerSetting * fgLayer,DMA2D_LayerSetting * outLayer)106 void DMA2D_PixelConvert(DMA2D_LayerSetting * fgLayer, DMA2D_LayerSetting * outLayer)
107 {
108     DMA2D->L[DMA2D_LAYER_FG].MAR = fgLayer->Address;
109     DMA2D->L[DMA2D_LAYER_FG].OR  = fgLayer->LineOffset;
110     DMA2D->L[DMA2D_LAYER_FG].PFCCR = (fgLayer->ColorMode << DMA2D_PFCCR_CFMT_Pos);
111 
112     DMA2D->L[DMA2D_LAYER_OUT].MAR = outLayer->Address;
113     DMA2D->L[DMA2D_LAYER_OUT].OR  = outLayer->LineOffset;
114     DMA2D->L[DMA2D_LAYER_OUT].PFCCR = (outLayer->ColorMode << DMA2D_PFCCR_CFMT_Pos);
115 
116     DMA2D->NLR = ((outLayer->LineCount - 1) << DMA2D_NLR_NLINE_Pos) |
117                  ((outLayer->LinePixel - 1) << DMA2D_NLR_NPIXEL_Pos);
118 
119     DMA2D->CR &= ~DMA2D_CR_MODE_Msk;
120     DMA2D->CR |= (1 << DMA2D_CR_MODE_Pos) |
121                  (1 << DMA2D_CR_START_Pos);
122 }
123 
124 
125 /******************************************************************************************************************************************
126 * 函数名称: DMA2D_PixelBlend()
127 * 功能说明: DMA2D像素混合
128 * 输    入: DMA2D_LayerSetting * fgLayer
129 *           DMA2D_LayerSetting * bgLayer
130 *           DMA2D_LayerSetting * outLayer
131 * 输    出: 无
132 * 注意事项: 无
133 ******************************************************************************************************************************************/
DMA2D_PixelBlend(DMA2D_LayerSetting * fgLayer,DMA2D_LayerSetting * bgLayer,DMA2D_LayerSetting * outLayer)134 void DMA2D_PixelBlend(DMA2D_LayerSetting * fgLayer, DMA2D_LayerSetting * bgLayer, DMA2D_LayerSetting * outLayer)
135 {
136     DMA2D->L[DMA2D_LAYER_FG].MAR = fgLayer->Address;
137     DMA2D->L[DMA2D_LAYER_FG].OR  = fgLayer->LineOffset;
138     DMA2D->L[DMA2D_LAYER_FG].PFCCR = (fgLayer->ColorMode << DMA2D_PFCCR_CFMT_Pos) |
139                                      (fgLayer->AlphaMode << DMA2D_PFCCR_AINV_Pos) |
140                                      (fgLayer->Alpha     << DMA2D_PFCCR_ALPHA_Pos);
141 
142     DMA2D->L[DMA2D_LAYER_BG].MAR = bgLayer->Address;
143     DMA2D->L[DMA2D_LAYER_BG].OR  = bgLayer->LineOffset;
144     DMA2D->L[DMA2D_LAYER_BG].PFCCR = (bgLayer->ColorMode << DMA2D_PFCCR_CFMT_Pos) |
145                                      (bgLayer->AlphaMode << DMA2D_PFCCR_AINV_Pos) |
146                                      (bgLayer->Alpha     << DMA2D_PFCCR_ALPHA_Pos);
147 
148     DMA2D->L[DMA2D_LAYER_OUT].MAR = outLayer->Address;
149     DMA2D->L[DMA2D_LAYER_OUT].OR  = outLayer->LineOffset;
150     DMA2D->L[DMA2D_LAYER_OUT].PFCCR = (outLayer->ColorMode << DMA2D_PFCCR_CFMT_Pos);
151 
152     DMA2D->NLR = ((outLayer->LineCount - 1) << DMA2D_NLR_NLINE_Pos) |
153                  ((outLayer->LinePixel - 1) << DMA2D_NLR_NPIXEL_Pos);
154 
155     DMA2D->CR &= ~DMA2D_CR_MODE_Msk;
156     DMA2D->CR |= (2 << DMA2D_CR_MODE_Pos) |
157                  (1 << DMA2D_CR_START_Pos);
158 }
159 
160 
161 /******************************************************************************************************************************************
162 * 函数名称: DMA2D_IsBusy()
163 * 功能说明: DMA2D忙查询
164 * 输    入: 无
165 * 输    出: uint32_t              1 正在传输   0 传输完成
166 * 注意事项: 无
167 ******************************************************************************************************************************************/
DMA2D_IsBusy(void)168 uint32_t DMA2D_IsBusy(void)
169 {
170     return (DMA2D->CR & DMA2D_CR_START_Msk) ? 1 : 0;
171 }
172 
173 
174 /******************************************************************************************************************************************
175 * 函数名称: DMA2D_INTEn()
176 * 功能说明: DMA2D中断使能,完成指定长度的数据传输时触发中断
177 * 输    入: 无
178 * 输    出: 无
179 * 注意事项: 无
180 ******************************************************************************************************************************************/
DMA2D_INTEn(void)181 void DMA2D_INTEn(void)
182 {
183     DMA2D->IE = DMA2D_IE_DONE_Msk;
184 }
185 
186 /******************************************************************************************************************************************
187 * 函数名称: DMA2D_INTDis()
188 * 功能说明: DMA2D中断禁止,完成指定长度的数据传输时不触发中断
189 * 输    入: 无
190 * 输    出: 无
191 * 注意事项: 无
192 ******************************************************************************************************************************************/
DMA2D_INTDis(void)193 void DMA2D_INTDis(void)
194 {
195     DMA2D->IE = 0;
196 }
197 
198 /******************************************************************************************************************************************
199 * 函数名称: DMA2D_INTClr()
200 * 功能说明: DMA2D中断标志清除
201 * 输    入: 无
202 * 输    出: 无
203 * 注意事项: 无
204 ******************************************************************************************************************************************/
DMA2D_INTClr(void)205 void DMA2D_INTClr(void)
206 {
207     DMA2D->IF = DMA2D_IF_DONE_Msk;
208 }
209 
210 /******************************************************************************************************************************************
211 * 函数名称: DMA2D_INTStat()
212 * 功能说明: DMA2D中断状态查询
213 * 输    入: 无
214 * 输    出: uint32_t          0 未完成指定长度的数据传输   1 完成指定长度的数据传输
215 * 注意事项: 无
216 ******************************************************************************************************************************************/
DMA2D_INTStat(void)217 uint32_t DMA2D_INTStat(void)
218 {
219     return (DMA2D->IF & DMA2D_IF_DONE_Msk) ? 1 : 0;
220 }
221