3232#include "arc_exception.h"
3333
3434#include "dw_pwm_timer.h"
35+ #include "embARC_debug.h"
3536
3637
3738/** check expressions used in DesignWare PWM_TIMER driver implementation */
@@ -174,7 +175,7 @@ int32_t dw_pwm_timer_close(DEV_PWM_TIMER *pwm_timer_obj)
174175}
175176
176177/** Read designware pwm_timer device value */
177- int32_t dw_pwm_timer_read (DEV_PWM_TIMER * pwm_timer_obj , uint32_t ch , uint32_t * mode , uint32_t * count_low , uint32_t * count_high )
178+ int32_t dw_pwm_timer_read (DEV_PWM_TIMER * pwm_timer_obj , uint32_t ch , uint32_t * mode , uint32_t * freq , uint32_t * dc )
178179{
179180 int32_t ercd = E_OK ;
180181 DEV_PWM_TIMER_INFO_PTR port_info_ptr = & (pwm_timer_obj -> pwm_timer_info );
@@ -187,18 +188,38 @@ int32_t dw_pwm_timer_read(DEV_PWM_TIMER *pwm_timer_obj, uint32_t ch, uint32_t *m
187188 DW_PWM_TIMER_CHECK_EXP (port_info_ptr -> opn_cnt > 0 , E_CLSED );
188189 DW_PWM_TIMER_CHECK_EXP ((ch >= 0 )&& (ch < port -> ch_num ), E_PAR );
189190
190- * count_low = dw_pwm_timer_count_get (port , ch );
191- * count_high = dw_pwm_timer_count2_get (port , ch );
191+ int32_t count_low = dw_pwm_timer_count_get (port , ch );
192+ int32_t count_high = dw_pwm_timer_count2_get (port , ch );
193+
192194 * mode = port -> mode [ch ];
195+ if (* mode == DEV_PWM_TIMER_MODE_TIMER ) {
196+ * dc = 100 ;
197+ if (count_low != 0 )
198+ * freq = port -> clock / (count_low * 2 );
199+ else
200+ * freq = 0 ;
201+ } else if (* mode == DEV_PWM_TIMER_MODE_PWM ) {
202+ if (count_low == 0 && count_high == 0 ) {
203+ * dc = 0 ;
204+ * freq = 0 ;
205+ } else {
206+ * dc = (count_high * 100 ) / (count_high + count_low );
207+ * freq = port -> clock / (count_high + count_low );
208+ }
209+ } else {
210+ * dc = 0 ;
211+ * freq = 0 ;
212+ }
193213
194214error_exit :
195215 return ercd ;
196216}
197217
198218/** Write designware pwm_timer device value */
199- int32_t dw_pwm_timer_write (DEV_PWM_TIMER * pwm_timer_obj , uint32_t ch , uint32_t mode , uint32_t count_low , uint32_t count_high )
219+ int32_t dw_pwm_timer_write (DEV_PWM_TIMER * pwm_timer_obj , uint32_t ch , uint32_t mode , uint32_t freq , uint32_t dc )
200220{
201221 int32_t ercd = E_OK ;
222+ int32_t count , count_high ;
202223 DEV_PWM_TIMER_INFO_PTR port_info_ptr = & (pwm_timer_obj -> pwm_timer_info );
203224
204225 /* START ERROR CHECK */
@@ -208,33 +229,45 @@ int32_t dw_pwm_timer_write(DEV_PWM_TIMER *pwm_timer_obj, uint32_t ch, uint32_t m
208229 DW_PWM_TIMER_CTRL_PTR port = (DW_PWM_TIMER_CTRL_PTR )(port_info_ptr -> pwm_timer_ctrl );
209230 DW_PWM_TIMER_CHECK_EXP (port_info_ptr -> opn_cnt > 0 , E_CLSED );
210231 DW_PWM_TIMER_CHECK_EXP ((ch >= 0 )&& (ch < port -> ch_num ), E_PAR );
211-
212- dw_pwm_timer_count_set (port , ch , count_low );
213- dw_pwm_timer_count2_set (port , ch , count_high );
232+ DW_PWM_TIMER_CHECK_EXP ((dc >= 0 )&& (dc <= 100 ), E_PAR );
214233
215234 if (mode == DEV_PWM_TIMER_MODE_TIMER ) {
235+ DW_PWM_TIMER_CHECK_EXP (freq > 0 , E_PAR );
216236 port -> mode [ch ] = mode ;
237+
238+ count = port -> clock / freq ;
239+ dw_pwm_timer_count_set (port , ch , count /2 );
240+ dw_pwm_timer_count2_set (port , ch , 0 );
241+
217242 dw_pwm_timer_timer_enable (port , ch );
218243 dw_pwm_timer_pwm_disable (port , ch );
219244 int_enable (port -> intno + ch );
220245 } else if (mode == DEV_PWM_TIMER_MODE_PWM ) {
246+ DW_PWM_TIMER_CHECK_EXP (freq > 0 , E_PAR );
221247 port -> mode [ch ] = mode ;
248+
249+ count = port -> clock / freq ;
250+ count_high = (count * dc )/100 ;
251+ dw_pwm_timer_count_set (port , ch , count - count_high );
252+ dw_pwm_timer_count2_set (port , ch , count_high );
253+ EMBARC_PRINTF ("clock = %d, count_low = %d, count_high = %d\r\n" ,port -> clock , count - count_high , count_high );
222254 dw_pwm_timer_timer_enable (port , ch );
223255 dw_pwm_timer_pwm_enable (port , ch );
224256 int_disable (port -> intno + ch );
225257 } else if (mode == DEV_PWM_TIMER_MODE_CLOSE ) {
226258 port -> mode [ch ] = mode ;
259+ dw_pwm_timer_count_set (port , ch , 0 );
260+ dw_pwm_timer_count2_set (port , ch , 0 );
227261 dw_pwm_timer_timer_disable (port , ch );
228262 dw_pwm_timer_pwm_disable (port , ch );
229263 int_disable (port -> intno + ch );
230264 }
231-
232265error_exit :
233266 return ercd ;
234267}
235268
236269/** Control designware pwm_timer device */
237- int32_t dw_pwm_timer_control (DEV_PWM_TIMER * pwm_timer_obj , uint32_t ctrl_cmd , void * par )
270+ int32_t dw_pwm_timer_control (DEV_PWM_TIMER * pwm_timer_obj , uint32_t ch , uint32_t ctrl_cmd , void * par )
238271{
239272 int32_t ercd = E_OK ;
240273 DEV_PWM_TIMER_INFO_PTR port_info_ptr = & (pwm_timer_obj -> pwm_timer_info );
@@ -245,53 +278,61 @@ int32_t dw_pwm_timer_control(DEV_PWM_TIMER *pwm_timer_obj, uint32_t ctrl_cmd, vo
245278
246279 DW_PWM_TIMER_CTRL_PTR port = (DW_PWM_TIMER_CTRL_PTR )(port_info_ptr -> pwm_timer_ctrl );
247280 DW_PWM_TIMER_CHECK_EXP (port_info_ptr -> opn_cnt > 0 , E_CLSED );
281+ DW_PWM_TIMER_CHECK_EXP ((ch >=0 )&& (ch < port -> ch_num ), E_PAR );
248282
249283 DEV_PWM_TIMER_CFG * cfg_ptr ;
250- uint32_t ch ;
251284 switch (ctrl_cmd ) {
252285 case PWM_TIMER_CMD_SET_CFG :
253286 cfg_ptr = (DEV_PWM_TIMER_CFG * ) par ;
254- DW_PWM_TIMER_CHECK_EXP ((cfg_ptr -> ch >=0 )&& (cfg_ptr -> ch < port -> ch_num ), E_PAR );
255287
256- dw_pwm_timer_count_set (port , cfg_ptr -> ch , cfg_ptr -> count_low );
257- dw_pwm_timer_count2_set (port , cfg_ptr -> ch , cfg_ptr -> count_high );
288+ dw_pwm_timer_count_set (port , ch , cfg_ptr -> count_low );
289+ dw_pwm_timer_count2_set (port , ch , cfg_ptr -> count_high );
258290 if (cfg_ptr -> isr_hander != NULL ) {
259- port -> ch_isr -> int_ch_handler_ptr [cfg_ptr -> ch ] = cfg_ptr -> isr_hander ;
291+ port -> ch_isr -> int_ch_handler_ptr [ch ] = cfg_ptr -> isr_hander ;
260292 }
261293 if (cfg_ptr -> mode == DEV_PWM_TIMER_MODE_TIMER ) {
262- port -> mode [cfg_ptr -> ch ] = cfg_ptr -> mode ;
263- dw_pwm_timer_timer_enable (port , cfg_ptr -> ch );
264- int_enable (port -> intno + cfg_ptr -> ch );
294+ port -> mode [ch ] = cfg_ptr -> mode ;
295+ dw_pwm_timer_timer_enable (port , ch );
296+ int_enable (port -> intno + ch );
265297 } else if (cfg_ptr -> mode == DEV_PWM_TIMER_MODE_PWM ) {
266- port -> mode [cfg_ptr -> ch ] = cfg_ptr -> mode ;
267- dw_pwm_timer_timer_enable (port , cfg_ptr -> ch );
268- dw_pwm_timer_pwm_enable (port , cfg_ptr -> ch );
298+ port -> mode [ch ] = cfg_ptr -> mode ;
299+ dw_pwm_timer_timer_enable (port , ch );
300+ dw_pwm_timer_pwm_enable (port , ch );
269301 } else if (cfg_ptr -> mode == DEV_PWM_TIMER_MODE_CLOSE ) {
270- port -> mode [cfg_ptr -> ch ] = cfg_ptr -> mode ;
271- dw_pwm_timer_timer_disable (port , cfg_ptr -> ch );
272- dw_pwm_timer_pwm_disable (port , cfg_ptr -> ch );
302+ port -> mode [ch ] = cfg_ptr -> mode ;
303+ dw_pwm_timer_timer_disable (port , ch );
304+ dw_pwm_timer_pwm_disable (port , ch );
273305 }
274306 break ;
275307 case PWM_TIMER_CMD_GET_CFG :
276308 cfg_ptr = (DEV_PWM_TIMER_CFG * ) par ;
277- DW_PWM_TIMER_CHECK_EXP ((cfg_ptr -> ch >=0 )&& (cfg_ptr -> ch < port -> ch_num ), E_PAR );
278- cfg_ptr -> count_low = dw_pwm_timer_count_get (port , cfg_ptr -> ch );
279- cfg_ptr -> count_high = dw_pwm_timer_count2_get (port , cfg_ptr -> ch );
309+ cfg_ptr -> count_low = dw_pwm_timer_count_get (port , ch );
310+ cfg_ptr -> count_high = dw_pwm_timer_count2_get (port , ch );
280311 if (cfg_ptr -> isr_hander != NULL ) {
281- cfg_ptr -> isr_hander = port -> ch_isr -> int_ch_handler_ptr [cfg_ptr -> ch ];
312+ cfg_ptr -> isr_hander = port -> ch_isr -> int_ch_handler_ptr [ch ];
282313 }
283- cfg_ptr -> mode = port -> mode [cfg_ptr -> ch ];
314+ cfg_ptr -> mode = port -> mode [ch ];
284315 break ;
285316 case PWM_TIMER_CMD_DIS_CH :
286- ch = (uint32_t ) par ;
287- DW_PWM_TIMER_CHECK_EXP ((ch >= 0 )&& (ch < port -> ch_num ), E_PAR );
288317 dw_pwm_timer_timer_disable (port , ch );
289318 break ;
290319 case PWM_TIMER_CMD_ENA_CH :
291- ch = (uint32_t ) par ;
292- DW_PWM_TIMER_CHECK_EXP ((ch >= 0 )&& (ch < port -> ch_num ), E_PAR );
293320 dw_pwm_timer_timer_enable (port , ch );
294321 break ;
322+ case PWM_TIMER_CMD_DIS_ISR :
323+ int_disable (port -> intno + ch );
324+ break ;
325+ case PWM_TIMER_CMD_ENA_ISR :
326+ int_enable (port -> intno + ch );
327+ break ;
328+ case PWM_TIMER_CMD_SET_ISR :
329+ DW_PWM_TIMER_CHECK_EXP ((par != NULL ) && CHECK_ALIGN_4BYTES (par ), E_PAR );
330+ port -> ch_isr -> int_ch_handler_ptr [ch ] = (DEV_PWM_TIMER_HANDLER )par ;
331+ break ;
332+ case PWM_TIMER_CMD_GET_ISR :
333+ DW_PWM_TIMER_CHECK_EXP ((par != NULL ) && CHECK_ALIGN_4BYTES (par ), E_PAR );
334+ par = (void * )(port -> ch_isr -> int_ch_handler_ptr [ch ]);
335+ break ;
295336 default :
296337 ercd = E_NOSPT ;
297338 break ;
0 commit comments