drv_pwm.c 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667
  1. /*
  2. * Copyright (c) 2006-2018, RT-Thread Development Team
  3. *
  4. * SPDX-License-Identifier: Apache-2.0
  5. *
  6. * Change Logs:
  7. * Date Author Notes
  8. * 2019-04-28 tyustli first version
  9. *
  10. */
  11. #include <rtthread.h>
  12. #ifdef BSP_USING_PWM
  13. #if !defined(BSP_USING_PWM1_CH0) && !defined(BSP_USING_PWM1_CH1) && !defined(BSP_USING_PWM1_CH2) && !defined(BSP_USING_PWM1_CH3) && \
  14. !defined(BSP_USING_PWM2_CH0) && !defined(BSP_USING_PWM2_CH1) && !defined(BSP_USING_PWM2_CH2) && !defined(BSP_USING_PWM2_CH3) && \
  15. !defined(BSP_USING_PWM3_CH0) && !defined(BSP_USING_PWM3_CH1) && !defined(BSP_USING_PWM3_CH2) && !defined(BSP_USING_PWM3_CH3) && \
  16. !defined(BSP_USING_PWM4_CH0) && !defined(BSP_USING_PWM4_CH1) && !defined(BSP_USING_PWM4_CH2) && !defined(BSP_USING_PWM4_CH3) && \
  17. !defined(BSP_USING_QTMR1_CH0) && !defined(BSP_USING_QTMR1_CH1) && !defined(BSP_USING_QTMR1_CH2) && !defined(BSP_USING_QTMR1_CH3) && \
  18. !defined(BSP_USING_QTMR2_CH0) && !defined(BSP_USING_QTMR2_CH1) && !defined(BSP_USING_QTMR2_CH2) && !defined(BSP_USING_QTMR2_CH3) && \
  19. !defined(BSP_USING_QTMR3_CH0) && !defined(BSP_USING_QTMR3_CH1) && !defined(BSP_USING_QTMR3_CH2) && !defined(BSP_USING_QTMR3_CH3) && \
  20. !defined(BSP_USING_QTMR4_CH0) && !defined(BSP_USING_QTMR4_CH1) && !defined(BSP_USING_QTMR4_CH2) && !defined(BSP_USING_QTMR4_CH3)
  21. #error "Please define at least one BSP_USING_PWMx_CHx or BSP_USING_QTMRx_CHx"
  22. #endif
  23. #define LOG_TAG "drv.pwm"
  24. #include <drv_log.h>
  25. #include <rtdevice.h>
  26. #include "fsl_pwm.h"
  27. #if defined(FSL_FEATURE_SOC_TMR_COUNT) && FSL_FEATURE_SOC_TMR_COUNT > 0
  28. #include "fsl_qtmr.h"
  29. #endif
  30. #include "drv_pwm.h"
  31. #define DEFAULT_PRE 5
  32. #define DEFAULT_DUTY 50
  33. #define DEFAULT_FRE 1000
  34. #define PWM_SRC_CLK_FREQ CLOCK_GetFreq(kCLOCK_IpgClk)
  35. #define DEFAULT_COMPLEMENTARY_PAIR kPWM_PwmA
  36. #define DEFAULT_POLARITY kPWM_HighTrue
  37. static pwm_signal_param_t Pwm_Signal;
  38. static rt_err_t imxrt_drv_pwm_control(struct rt_device_pwm *device, int cmd, void *arg);
  39. static struct rt_pwm_ops imxrt_drv_ops =
  40. {
  41. .control = imxrt_drv_pwm_control
  42. };
  43. static rt_err_t imxrt_drv_pwm_enable(struct rt_device_pwm *device, struct rt_pwm_configuration *configuration, rt_bool_t enable)
  44. {
  45. PWM_Type *base;
  46. pwm_module_control_t pwm_module_control;
  47. base = (PWM_Type *)device->parent.user_data;
  48. pwm_module_control = (pwm_module_control_t)(1 << configuration->channel);
  49. if (!enable)
  50. {
  51. PWM_StopTimer(base, pwm_module_control);
  52. }
  53. else
  54. {
  55. PWM_StartTimer(base, pwm_module_control);
  56. }
  57. return RT_EOK;
  58. }
  59. static rt_err_t imxrt_drv_pwm_get(struct rt_device_pwm *device, struct rt_pwm_configuration *configuration)
  60. {
  61. uint8_t get_duty;
  62. uint16_t pulseCnt = 0, pwmHighPulse = 0;
  63. uint32_t get_frequence;
  64. uint32_t pwmClock;
  65. PWM_Type *base;
  66. pwm_submodule_t pwm_submodule;
  67. base = (PWM_Type *)device->parent.user_data;
  68. pwm_submodule = (pwm_submodule_t)configuration->channel;
  69. /* get frequence */
  70. get_frequence = base->SM[pwm_submodule].VAL1;
  71. pwmClock = (PWM_SRC_CLK_FREQ / (1U << ((base->SM[pwm_submodule].CTRL & PWM_CTRL_PRSC_MASK) >> PWM_CTRL_PRSC_SHIFT)));
  72. get_frequence = pwmClock / get_frequence;
  73. /* get dutycycle */
  74. pulseCnt = base->SM[pwm_submodule].VAL1;
  75. pwmHighPulse = pulseCnt - (base->SM[pwm_submodule].VAL2) * 2;
  76. get_duty = pwmHighPulse * 100 / pulseCnt;
  77. /* conversion */
  78. configuration->period = 1000000000 / get_frequence;
  79. configuration->pulse = get_duty * configuration->period / 100;
  80. return RT_EOK;
  81. }
  82. static rt_err_t imxrt_drv_pwm_set(struct rt_device_pwm *device, struct rt_pwm_configuration *configuration)
  83. {
  84. RT_ASSERT(configuration->period > 0);
  85. RT_ASSERT(configuration->pulse <= configuration->period);
  86. PWM_Type *base;
  87. pwm_submodule_t pwm_submodule;
  88. pwm_module_control_t pwm_module_control;
  89. uint32_t period = 0;
  90. uint8_t duty = 0;
  91. base = (PWM_Type *)device->parent.user_data;
  92. pwm_submodule = (pwm_submodule_t)configuration->channel;
  93. pwm_module_control = (pwm_module_control_t)(1 << configuration->channel);
  94. duty = configuration->pulse * 100 / configuration->period;
  95. Pwm_Signal.dutyCyclePercent = duty;
  96. period = (uint32_t)(1000000000 / configuration->period);
  97. PWM_SetupPwm(base, pwm_submodule, &Pwm_Signal, 1, kPWM_CenterAligned, period, PWM_SRC_CLK_FREQ);
  98. PWM_UpdatePwmDutycycle(base, pwm_submodule, DEFAULT_COMPLEMENTARY_PAIR, kPWM_CenterAligned, duty);
  99. PWM_SetPwmLdok(base, pwm_module_control, true);
  100. return RT_EOK;
  101. }
  102. static rt_err_t imxrt_drv_pwm_control(struct rt_device_pwm *device, int cmd, void *arg)
  103. {
  104. struct rt_pwm_configuration *configuration = (struct rt_pwm_configuration *)arg;
  105. switch (cmd)
  106. {
  107. case PWM_CMD_ENABLE:
  108. return imxrt_drv_pwm_enable(device, configuration, RT_TRUE);
  109. case PWM_CMD_DISABLE:
  110. return imxrt_drv_pwm_enable(device, configuration, RT_FALSE);
  111. case PWM_CMD_SET:
  112. return imxrt_drv_pwm_set(device, configuration);
  113. case PWM_CMD_GET:
  114. return imxrt_drv_pwm_get(device, configuration);
  115. default:
  116. return RT_EINVAL;
  117. }
  118. }
  119. static rt_err_t imxrt_drv_pwm_init(PWM_Type *base, pwm_submodule_t pwm_submodule, uint16_t psc, uint32_t fre, uint8_t duty)
  120. {
  121. pwm_config_t PwmConfig;
  122. uint8_t fault_input;
  123. pwm_clock_prescale_t pwm_prescale = (pwm_clock_prescale_t)psc;
  124. fault_input = (uint8_t)pwm_submodule;
  125. PWM_GetDefaultConfig(&PwmConfig);
  126. PwmConfig.prescale = pwm_prescale;
  127. PwmConfig.reloadLogic = kPWM_ReloadPwmFullCycle;
  128. PwmConfig.pairOperation = kPWM_Independent;
  129. PwmConfig.enableDebugMode = true;
  130. if (PWM_Init(base, pwm_submodule, &PwmConfig) == kStatus_Fail)
  131. {
  132. LOG_E("init pwm failed \n");
  133. return -RT_ERROR;
  134. }
  135. base->SM[fault_input].DISMAP[0] = 0x00;
  136. base->SM[fault_input].DISMAP[1] = 0x00;
  137. Pwm_Signal.pwmChannel = DEFAULT_COMPLEMENTARY_PAIR;
  138. Pwm_Signal.level = DEFAULT_POLARITY;
  139. Pwm_Signal.dutyCyclePercent = duty;
  140. PWM_SetupPwm(base, pwm_submodule, &Pwm_Signal, 1, kPWM_CenterAligned, fre, PWM_SRC_CLK_FREQ);
  141. PWM_SetPwmLdok(base, pwm_submodule, true);
  142. return RT_EOK;
  143. }
  144. #ifdef BSP_USING_PWM1
  145. static rt_err_t imxrt_pwm1_init(PWM_Type *base)
  146. {
  147. #ifdef BSP_USING_PWM1_CH0
  148. if (imxrt_drv_pwm_init(base, kPWM_Module_0, DEFAULT_PRE, DEFAULT_FRE, DEFAULT_DUTY) != RT_EOK)
  149. {
  150. return -RT_ERROR;
  151. }
  152. #endif /* BSP_USING_PWM1_CH0 */
  153. #ifdef BSP_USING_PWM1_CH1
  154. if (imxrt_drv_pwm_init(base, kPWM_Module_1, DEFAULT_PRE, DEFAULT_FRE, DEFAULT_DUTY) != RT_EOK)
  155. {
  156. return -RT_ERROR;
  157. }
  158. #endif /* BSP_USING_PWM1_CH1 */
  159. #ifdef BSP_USING_PWM1_CH2
  160. if (imxrt_drv_pwm_init(base, kPWM_Module_2, DEFAULT_PRE, DEFAULT_FRE, DEFAULT_DUTY) != RT_EOK)
  161. {
  162. return -RT_ERROR;
  163. }
  164. #endif /*BSP_USING_PWM1_CH2 */
  165. #ifdef BSP_USING_PWM1_CH3
  166. if (imxrt_drv_pwm_init(base, kPWM_Module_3, DEFAULT_PRE, DEFAULT_FRE, DEFAULT_DUTY) != RT_EOK)
  167. {
  168. return -RT_ERROR;
  169. }
  170. #endif /* BSP_USING_PWM1_CH3 */
  171. return RT_EOK;
  172. }
  173. #endif /* BSP_USING_PWM1 */
  174. #ifdef BSP_USING_PWM2
  175. static rt_err_t imxrt_pwm2_init(PWM_Type *base)
  176. {
  177. #ifdef BSP_USING_PWM2_CH0
  178. if (imxrt_drv_pwm_init(base, kPWM_Module_0, DEFAULT_PRE, DEFAULT_FRE, DEFAULT_DUTY) != RT_EOK)
  179. {
  180. return -RT_ERROR;
  181. }
  182. #endif /* BSP_USING_PWM2_CH0 */
  183. #ifdef BSP_USING_PWM2_CH1
  184. if (imxrt_drv_pwm_init(base, kPWM_Module_1, DEFAULT_PRE, DEFAULT_FRE, DEFAULT_DUTY) != RT_EOK)
  185. {
  186. return -RT_ERROR;
  187. }
  188. #endif /* BSP_USING_PWM2_CH1 */
  189. #ifdef BSP_USING_PWM2_CH2
  190. if (imxrt_drv_pwm_init(base, kPWM_Module_2, DEFAULT_PRE, DEFAULT_FRE, DEFAULT_DUTY) != RT_EOK)
  191. {
  192. return -RT_ERROR;
  193. }
  194. #endif /*BSP_USING_PWM2_CH2 */
  195. #ifdef BSP_USING_PWM2_CH3
  196. if (imxrt_drv_pwm_init(base, kPWM_Module_3, DEFAULT_PRE, DEFAULT_FRE, DEFAULT_DUTY) != RT_EOK)
  197. {
  198. return -RT_ERROR;
  199. }
  200. #endif /* BSP_USING_PWM2_CH3 */
  201. return RT_EOK;
  202. }
  203. #endif /* BSP_USING_PWM2 */
  204. #ifdef BSP_USING_PWM3
  205. static rt_err_t imxrt_pwm3_init(PWM_Type *base)
  206. {
  207. #ifdef BSP_USING_PWM3_CH0
  208. if (imxrt_drv_pwm_init(base, kPWM_Module_0, DEFAULT_PRE, DEFAULT_FRE, DEFAULT_DUTY) != RT_EOK)
  209. {
  210. return -RT_ERROR;
  211. }
  212. #endif /* BSP_USING_PWM3_CH0 */
  213. #ifdef BSP_USING_PWM3_CH1
  214. if (imxrt_drv_pwm_init(base, kPWM_Module_1, DEFAULT_PRE, DEFAULT_FRE, DEFAULT_DUTY) != RT_EOK)
  215. {
  216. return -RT_ERROR;
  217. }
  218. #endif /* BSP_USING_PWM3_CH1 */
  219. #ifdef BSP_USING_PWM3_CH2
  220. if (imxrt_drv_pwm_init(base, kPWM_Module_2, DEFAULT_PRE, DEFAULT_FRE, DEFAULT_DUTY) != RT_EOK)
  221. {
  222. return -RT_ERROR;
  223. }
  224. #endif /*BSP_USING_PWM3_CH2 */
  225. #ifdef BSP_USING_PWM3_CH3
  226. if (imxrt_drv_pwm_init(base, kPWM_Module_3, DEFAULT_PRE, DEFAULT_FRE, DEFAULT_DUTY) != RT_EOK)
  227. {
  228. return -RT_ERROR;
  229. }
  230. #endif /* BSP_USING_PWM3_CH3 */
  231. return RT_EOK;
  232. }
  233. #endif /* BSP_USING_PWM3 */
  234. #ifdef BSP_USING_PWM4
  235. static rt_err_t imxrt_pwm4_init(PWM_Type *base)
  236. {
  237. #ifdef BSP_USING_PWM4_CH0
  238. if (imxrt_drv_pwm_init(base, kPWM_Module_0, DEFAULT_PRE, DEFAULT_FRE, DEFAULT_DUTY) != RT_EOK)
  239. {
  240. return -RT_ERROR;
  241. }
  242. #endif /* BSP_USING_PWM4_CH0 */
  243. #ifdef BSP_USING_PWM4_CH1
  244. if (imxrt_drv_pwm_init(base, kPWM_Module_1, DEFAULT_PRE, DEFAULT_FRE, DEFAULT_DUTY) != RT_EOK)
  245. {
  246. return -RT_ERROR;
  247. }
  248. #endif /* BSP_USING_PWM4_CH1 */
  249. #ifdef BSP_USING_PWM4_CH2
  250. if (imxrt_drv_pwm_init(base, kPWM_Module_2, DEFAULT_PRE, DEFAULT_FRE, DEFAULT_DUTY) != RT_EOK)
  251. {
  252. return -RT_ERROR;
  253. }
  254. #endif /*BSP_USING_PWM4_CH2 */
  255. #ifdef BSP_USING_PWM4_CH3
  256. if (imxrt_drv_pwm_init(base, kPWM_Module_3, DEFAULT_PRE, DEFAULT_FRE, DEFAULT_DUTY) != RT_EOK)
  257. {
  258. return -RT_ERROR;
  259. }
  260. #endif /* BSP_USING_PWM4_CH3 */
  261. return RT_EOK;
  262. }
  263. #endif /* BSP_USING_PWM4 */
  264. static rt_err_t imxrt_drv_qtmr_control(struct rt_device_pwm *device, int cmd, void *arg);
  265. static struct rt_pwm_ops imxrt_drv_qtmr_ops =
  266. {
  267. .control = imxrt_drv_qtmr_control
  268. };
  269. static rt_err_t imxrt_drv_qtmr_enable(struct rt_device_pwm *device, struct rt_pwm_configuration *configuration, rt_bool_t enable)
  270. {
  271. TMR_Type *base;
  272. base = (TMR_Type *)device->parent.user_data;
  273. if (!enable)
  274. {
  275. QTMR_StopTimer(base, configuration->channel);
  276. base->CHANNEL[configuration->channel].SCTRL |= (TMR_SCTRL_FORCE_MASK | TMR_SCTRL_OEN_MASK);
  277. }
  278. else
  279. {
  280. QTMR_StartTimer(base, configuration->channel, kQTMR_PriSrcRiseEdge);
  281. }
  282. return RT_EOK;
  283. }
  284. static rt_err_t imxrt_drv_qtmr_get(struct rt_device_pwm *device, struct rt_pwm_configuration *configuration)
  285. {
  286. TMR_Type *base;
  287. rt_uint32_t high_count, low_count, clk_divider, clk_freq;
  288. base = (TMR_Type *)device->parent.user_data;
  289. low_count = base->CHANNEL[configuration->channel].COMP1;
  290. high_count = base->CHANNEL[configuration->channel].COMP2;
  291. clk_divider = 1 << (((base->CHANNEL[configuration->channel].CTRL & TMR_CTRL_PCS_MASK) >> TMR_CTRL_PCS_SHIFT) - 8);
  292. clk_freq = CLOCK_GetFreq(kCLOCK_IpgClk) / clk_divider;
  293. configuration->period = 1000000000 / clk_freq * (high_count + low_count);
  294. configuration->pulse = 1000000000 / clk_freq * high_count;
  295. return RT_EOK;
  296. }
  297. static rt_err_t imxrt_drv_qtmr_set(struct rt_device_pwm *device, struct rt_pwm_configuration *configuration)
  298. {
  299. RT_ASSERT(configuration->period > 0);
  300. RT_ASSERT(configuration->pulse <= configuration->period);
  301. TMR_Type *base = (TMR_Type *)device->parent.user_data;
  302. rt_size_t clk_freq = CLOCK_GetFreq(kCLOCK_IpgClk) / (1 << (((base->CHANNEL[configuration->channel].CTRL & TMR_CTRL_PCS_MASK) >> TMR_CTRL_PCS_SHIFT) - 8));
  303. rt_size_t current_period_count = base->CHANNEL[configuration->channel].CMPLD1 + base->CHANNEL[configuration->channel].CMPLD2;
  304. rt_size_t period_count = clk_freq / (1000000000 / configuration->period);
  305. if (current_period_count == period_count)
  306. {
  307. rt_size_t high_count = period_count * configuration->pulse / configuration->period;
  308. rt_size_t low_count = period_count - high_count;
  309. base->CHANNEL[configuration->channel].CMPLD1 = (uint16_t)low_count;
  310. base->CHANNEL[configuration->channel].CMPLD2 = (uint16_t)high_count;
  311. }
  312. else
  313. {
  314. rt_bool_t timer_is_on = base->CHANNEL[configuration->channel].CTRL & TMR_CTRL_CM_MASK;
  315. rt_uint8_t duty = configuration->pulse * 100 / configuration->period;
  316. QTMR_StopTimer(base, configuration->channel);
  317. if (kStatus_Success != QTMR_SetupPwm(base, configuration->channel, 1000000000 / configuration->period, duty, DEFAULT_POLARITY, clk_freq))
  318. {
  319. LOG_E(LOG_TAG" setup pwm failed \n");
  320. return -RT_ERROR;
  321. }
  322. if (timer_is_on)
  323. {
  324. QTMR_StartTimer(base, configuration->channel, kQTMR_PriSrcRiseEdge);
  325. }
  326. }
  327. return RT_EOK;
  328. }
  329. static rt_err_t imxrt_drv_qtmr_control(struct rt_device_pwm *device, int cmd, void *arg)
  330. {
  331. struct rt_pwm_configuration *configuration = (struct rt_pwm_configuration *)arg;
  332. switch (cmd)
  333. {
  334. case PWM_CMD_ENABLE:
  335. return imxrt_drv_qtmr_enable(device, configuration, RT_TRUE);
  336. case PWM_CMD_DISABLE:
  337. return imxrt_drv_qtmr_enable(device, configuration, RT_FALSE);
  338. case PWM_CMD_SET:
  339. return imxrt_drv_qtmr_set(device, configuration);
  340. case PWM_CMD_GET:
  341. return imxrt_drv_qtmr_get(device, configuration);
  342. default:
  343. return RT_EINVAL;
  344. }
  345. }
  346. static rt_err_t imxrt_drv_qtmr_init(TMR_Type *base, qtmr_channel_selection_t channel, uint16_t psc, uint32_t fre, uint8_t duty)
  347. {
  348. qtmr_config_t qtmr_config;
  349. rt_uint32_t qtmr_clock_freq;
  350. QTMR_GetDefaultConfig(&qtmr_config);
  351. qtmr_config.primarySource = (qtmr_primary_count_source_t)(psc + 8);
  352. qtmr_clock_freq = CLOCK_GetFreq(kCLOCK_IpgClk) / (1 << psc);
  353. QTMR_Init(base, channel, &qtmr_config);
  354. if (kStatus_Success != QTMR_SetupPwm(base, channel, fre, duty, DEFAULT_POLARITY, qtmr_clock_freq))
  355. {
  356. LOG_E(LOG_TAG" setup pwm failed \n");
  357. return -RT_ERROR;
  358. }
  359. return RT_EOK;
  360. }
  361. static rt_err_t imxrt_qtmr_init()
  362. {
  363. TMR_Type *base_list[] =
  364. {
  365. #ifdef BSP_USING_QTMR1
  366. TMR1,
  367. #endif
  368. #ifdef BSP_USING_QTMR2
  369. TMR2,
  370. #endif
  371. #ifdef BSP_USING_QTMR3
  372. TMR3,
  373. #endif
  374. #ifdef BSP_USING_QTMR4
  375. TMR4,
  376. #endif
  377. };
  378. rt_uint8_t channel_list[] =
  379. {
  380. #ifdef BSP_USING_QTMR1
  381. #ifdef BSP_USING_QTMR1_CH0
  382. 1 << 0 |
  383. #endif
  384. #ifdef BSP_USING_QTMR1_CH1
  385. 1 << 1 |
  386. #endif
  387. #ifdef BSP_USING_QTMR1_CH2
  388. 1 << 2 |
  389. #endif
  390. #ifdef BSP_USING_QTMR1_CH3
  391. 1 << 3 |
  392. #endif
  393. 0,
  394. #endif
  395. #ifdef BSP_USING_QTMR2
  396. #ifdef BSP_USING_QTMR2_CH0
  397. 1 << 0 |
  398. #endif
  399. #ifdef BSP_USING_QTMR2_CH1
  400. 1 << 1 |
  401. #endif
  402. #ifdef BSP_USING_QTMR2_CH2
  403. 1 << 2 |
  404. #endif
  405. #ifdef BSP_USING_QTMR2_CH3
  406. 1 << 3 |
  407. #endif
  408. 0,
  409. #endif
  410. #ifdef BSP_USING_QTMR3
  411. #ifdef BSP_USING_QTMR3_CH0
  412. 1 << 0 |
  413. #endif
  414. #ifdef BSP_USING_QTMR3_CH1
  415. 1 << 1 |
  416. #endif
  417. #ifdef BSP_USING_QTMR3_CH2
  418. 1 << 2 |
  419. #endif
  420. #ifdef BSP_USING_QTMR3_CH3
  421. 1 << 3 |
  422. #endif
  423. 0,
  424. #endif
  425. #ifdef BSP_USING_QTMR4
  426. #ifdef BSP_USING_QTMR4_CH0
  427. 1 << 0 |
  428. #endif
  429. #ifdef BSP_USING_QTMR4_CH1
  430. 1 << 1 |
  431. #endif
  432. #ifdef BSP_USING_QTMR4_CH2
  433. 1 << 2 |
  434. #endif
  435. #ifdef BSP_USING_QTMR4_CH3
  436. 1 << 3 |
  437. #endif
  438. 0,
  439. #endif
  440. };
  441. for (rt_uint8_t i = 0; i < sizeof(base_list)/sizeof(TMR_Type *); ++i)
  442. {
  443. for (rt_uint8_t j = 0; j < 8; ++j)
  444. {
  445. if ((channel_list[i] >> j) & 1)
  446. {
  447. if (imxrt_drv_qtmr_init(base_list[i], j, DEFAULT_PRE, DEFAULT_FRE, DEFAULT_DUTY) != RT_EOK)
  448. {
  449. return -RT_ERROR;
  450. }
  451. }
  452. }
  453. }
  454. return RT_EOK;
  455. }
  456. int rt_hw_pwm_init(void)
  457. {
  458. rt_err_t ret = RT_EOK;
  459. #ifdef BSP_USING_PWM1
  460. static struct rt_device_pwm pwm1_device;
  461. if (imxrt_pwm1_init(PWM1) != RT_EOK)
  462. {
  463. LOG_E("init pwm1 failed\n");
  464. }
  465. ret = rt_device_pwm_register(&pwm1_device, "pwm1", &imxrt_drv_ops, PWM1);
  466. if (ret != RT_EOK)
  467. {
  468. LOG_E("%s register failed", "pwm1");
  469. }
  470. #endif /* BSP_USING_PWM1 */
  471. #ifdef BSP_USING_PWM2
  472. static struct rt_device_pwm pwm2_device;
  473. if (imxrt_pwm2_init(PWM2) != RT_EOK)
  474. {
  475. LOG_E("init pwm2 failed\n");
  476. }
  477. ret = rt_device_pwm_register(&pwm2_device, "pwm2", &imxrt_drv_ops, PWM2);
  478. if (ret != RT_EOK)
  479. {
  480. LOG_E("%s register failed", "pwm2");
  481. }
  482. #endif /* BSP_USING_PWM2 */
  483. #ifdef BSP_USING_PWM3
  484. static struct rt_device_pwm pwm3_device;
  485. if (imxrt_pwm3_init(PWM3) != RT_EOK)
  486. {
  487. LOG_E("init pwm3 failed\n");
  488. }
  489. ret = rt_device_pwm_register(&pwm3_device, "pwm3", &imxrt_drv_ops, PWM3);
  490. if (ret != RT_EOK)
  491. {
  492. LOG_E("%s register failed", "pwm3");
  493. }
  494. #endif /* BSP_USING_PWM3 */
  495. #ifdef BSP_USING_PWM4
  496. static struct rt_device_pwm pwm4_device;
  497. if (imxrt_pwm4_init(PWM4) != RT_EOK)
  498. {
  499. LOG_E("init pwm4 failed\n");
  500. }
  501. ret = rt_device_pwm_register(&pwm4_device, "pwm4", &imxrt_drv_ops, PWM4);
  502. if (ret != RT_EOK)
  503. {
  504. LOG_E("%s register failed", "pwm4");
  505. }
  506. #endif /* BSP_USING_PWM4 */
  507. #if defined(BSP_USING_QTMR1) || defined(BSP_USING_QTMR2) || defined(BSP_USING_QTMR3) || defined(BSP_USING_QTMR4)
  508. if (imxrt_qtmr_init() != RT_EOK)
  509. {
  510. LOG_E(LOG_TAG" init qtmr failed");
  511. }
  512. #endif
  513. #ifdef BSP_USING_QTMR1
  514. static struct rt_device_pwm qtmr1_device;
  515. ret = rt_device_pwm_register(&qtmr1_device, "pwm5", &imxrt_drv_qtmr_ops, TMR1);
  516. if (ret != RT_EOK)
  517. {
  518. LOG_E("%s register failed", "pwm5");
  519. }
  520. #endif /* BSP_USING_QTMR1 */
  521. #ifdef BSP_USING_QTMR2
  522. static struct rt_device_pwm qtmr2_device;
  523. ret = rt_device_pwm_register(&qtmr2_device, "pwm6", &imxrt_drv_qtmr_ops, TMR2);
  524. if (ret != RT_EOK)
  525. {
  526. LOG_E("%s register failed", "pwm6");
  527. }
  528. #endif /* BSP_USING_QTMR2 */
  529. #ifdef BSP_USING_QTMR3
  530. static struct rt_device_pwm qtmr3_device;
  531. ret = rt_device_pwm_register(&qtmr3_device, "pwm7", &imxrt_drv_qtmr_ops, TMR3);
  532. if (ret != RT_EOK)
  533. {
  534. LOG_E("%s register failed", "pwm7");
  535. }
  536. #endif /* BSP_USING_QTMR3 */
  537. #ifdef BSP_USING_QTMR4
  538. static struct rt_device_pwm qtmr4_device;
  539. ret = rt_device_pwm_register(&qtmr4_device, "pwm8", &imxrt_drv_qtmr_ops, TMR4);
  540. if (ret != RT_EOK)
  541. {
  542. LOG_E("%s register failed", "pwm8");
  543. }
  544. #endif /* BSP_USING_QTMR4 */
  545. return ret;
  546. }
  547. INIT_BOARD_EXPORT(rt_hw_pwm_init);
  548. #endif /* BSP_USING_PWM */