drv_pwm.c 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744
  1. /*
  2. * Copyright (c) 2006-2021, RT-Thread Development Team
  3. *
  4. * SPDX-License-Identifier: Apache-2.0
  5. *
  6. * Change Logs:
  7. * Date Author Notes
  8. * 2022-05-16 shelton first version
  9. * 2024-09-24 shelton update driver
  10. */
  11. #include "drv_common.h"
  12. #ifdef RT_USING_PWM
  13. #include "drv_pwm.h"
  14. #include <drivers/dev_pwm.h>
  15. //#define DRV_DEBUG
  16. #define LOG_TAG "drv.pwm"
  17. #include <drv_log.h>
  18. #define MAX_PERIOD 65535
  19. #define MIN_PERIOD 3
  20. #define MIN_PULSE 2
  21. struct at32_pwm
  22. {
  23. struct rt_device_pwm pwm_device;
  24. tmr_type* tmr_x;
  25. rt_uint8_t channel;
  26. char *name;
  27. };
  28. enum
  29. {
  30. #ifdef BSP_USING_PWM1
  31. PWM1_INDEX,
  32. #endif
  33. #ifdef BSP_USING_PWM2
  34. PWM2_INDEX,
  35. #endif
  36. #ifdef BSP_USING_PWM3
  37. PWM3_INDEX,
  38. #endif
  39. #ifdef BSP_USING_PWM4
  40. PWM4_INDEX,
  41. #endif
  42. #ifdef BSP_USING_PWM5
  43. PWM5_INDEX,
  44. #endif
  45. #ifdef BSP_USING_PWM6
  46. PWM6_INDEX,
  47. #endif
  48. #ifdef BSP_USING_PWM7
  49. PWM7_INDEX,
  50. #endif
  51. #ifdef BSP_USING_PWM8
  52. PWM8_INDEX,
  53. #endif
  54. #ifdef BSP_USING_PWM9
  55. PWM9_INDEX,
  56. #endif
  57. #ifdef BSP_USING_PWM10
  58. PWM10_INDEX,
  59. #endif
  60. #ifdef BSP_USING_PWM11
  61. PWM11_INDEX,
  62. #endif
  63. #ifdef BSP_USING_PWM12
  64. PWM12_INDEX,
  65. #endif
  66. #ifdef BSP_USING_PWM13
  67. PWM13_INDEX,
  68. #endif
  69. };
  70. static struct at32_pwm at32_pwm_obj[] =
  71. {
  72. #ifdef BSP_USING_PWM1
  73. PWM1_CONFIG,
  74. #endif
  75. #ifdef BSP_USING_PWM2
  76. PWM2_CONFIG,
  77. #endif
  78. #ifdef BSP_USING_PWM3
  79. PWM3_CONFIG,
  80. #endif
  81. #ifdef BSP_USING_PWM4
  82. PWM4_CONFIG,
  83. #endif
  84. #ifdef BSP_USING_PWM5
  85. PWM5_CONFIG,
  86. #endif
  87. #ifdef BSP_USING_PWM6
  88. PWM6_CONFIG,
  89. #endif
  90. #ifdef BSP_USING_PWM7
  91. PWM7_CONFIG,
  92. #endif
  93. #ifdef BSP_USING_PWM8
  94. PWM8_CONFIG,
  95. #endif
  96. #ifdef BSP_USING_PWM9
  97. PWM9_CONFIG,
  98. #endif
  99. #ifdef BSP_USING_PWM10
  100. PWM10_CONFIG,
  101. #endif
  102. #ifdef BSP_USING_PWM11
  103. PWM11_CONFIG,
  104. #endif
  105. #ifdef BSP_USING_PWM12
  106. PWM12_CONFIG,
  107. #endif
  108. #ifdef BSP_USING_PWM13
  109. PWM13_CONFIG,
  110. #endif
  111. };
  112. static rt_err_t drv_pwm_control(struct rt_device_pwm *device, int cmd, void *arg);
  113. static struct rt_pwm_ops drv_ops =
  114. {
  115. drv_pwm_control
  116. };
  117. static void tmr_pclk_get(rt_uint32_t *pclk1_doubler, rt_uint32_t *pclk2_doubler)
  118. {
  119. crm_clocks_freq_type clocks_struct;
  120. *pclk1_doubler = 1;
  121. *pclk2_doubler = 1;
  122. crm_clocks_freq_get(&clocks_struct);
  123. if(clocks_struct.ahb_freq != clocks_struct.apb1_freq)
  124. {
  125. *pclk1_doubler = 2;
  126. }
  127. if(clocks_struct.ahb_freq != clocks_struct.apb2_freq)
  128. {
  129. *pclk2_doubler = 2;
  130. }
  131. }
  132. static rt_err_t at32_hw_pwm_init(struct at32_pwm *instance)
  133. {
  134. tmr_output_config_type tmr_oc_config_struct;
  135. tmr_type *tmr_x = instance->tmr_x;
  136. at32_msp_tmr_init(tmr_x);
  137. tmr_base_init(tmr_x, 0, 0);
  138. tmr_clock_source_div_set(tmr_x, TMR_CLOCK_DIV1);
  139. /* pwm mode configuration */
  140. tmr_output_default_para_init(&tmr_oc_config_struct);
  141. /* config pwm mode */
  142. tmr_oc_config_struct.oc_mode = TMR_OUTPUT_CONTROL_PWM_MODE_A;
  143. /* config tmr pwm output */
  144. if(instance->channel & 0x01)
  145. {
  146. tmr_output_channel_config(tmr_x, TMR_SELECT_CHANNEL_1, &tmr_oc_config_struct);
  147. tmr_output_channel_buffer_enable(tmr_x, TMR_SELECT_CHANNEL_1, TRUE);
  148. }
  149. if(instance->channel & 0x02)
  150. {
  151. tmr_output_channel_config(tmr_x, TMR_SELECT_CHANNEL_2, &tmr_oc_config_struct);
  152. tmr_output_channel_buffer_enable(tmr_x, TMR_SELECT_CHANNEL_2, TRUE);
  153. }
  154. if(instance->channel & 0x04)
  155. {
  156. tmr_output_channel_config(tmr_x, TMR_SELECT_CHANNEL_3, &tmr_oc_config_struct);
  157. tmr_output_channel_buffer_enable(tmr_x, TMR_SELECT_CHANNEL_3, TRUE);
  158. }
  159. if(instance->channel & 0x08)
  160. {
  161. tmr_output_channel_config(tmr_x, TMR_SELECT_CHANNEL_4, &tmr_oc_config_struct);
  162. tmr_output_channel_buffer_enable(tmr_x, TMR_SELECT_CHANNEL_4, TRUE);
  163. }
  164. /* enable output */
  165. tmr_output_enable(tmr_x, TRUE);
  166. /* enable overflow request */
  167. tmr_overflow_request_source_set(tmr_x, TRUE);
  168. return RT_EOK;
  169. }
  170. static rt_err_t drv_pwm_enable(tmr_type* tmr_x, struct rt_pwm_configuration *configuration, rt_bool_t enable)
  171. {
  172. /* get the value of channel */
  173. rt_uint32_t channel = configuration->channel;
  174. if (!configuration->complementary)
  175. {
  176. if (!enable)
  177. {
  178. if(channel == 1)
  179. {
  180. tmr_channel_enable(tmr_x, TMR_SELECT_CHANNEL_1, FALSE);
  181. }
  182. else if(channel == 2)
  183. {
  184. tmr_channel_enable(tmr_x, TMR_SELECT_CHANNEL_2, FALSE);
  185. }
  186. else if(channel == 3)
  187. {
  188. tmr_channel_enable(tmr_x, TMR_SELECT_CHANNEL_3, FALSE);
  189. }
  190. else if(channel == 4)
  191. {
  192. tmr_channel_enable(tmr_x, TMR_SELECT_CHANNEL_4, FALSE);
  193. }
  194. }
  195. else
  196. {
  197. if(channel == 1)
  198. {
  199. tmr_channel_enable(tmr_x, TMR_SELECT_CHANNEL_1, TRUE);
  200. }
  201. else if(channel == 2)
  202. {
  203. tmr_channel_enable(tmr_x, TMR_SELECT_CHANNEL_2, TRUE);
  204. }
  205. else if(channel == 3)
  206. {
  207. tmr_channel_enable(tmr_x, TMR_SELECT_CHANNEL_3, TRUE);
  208. }
  209. else if(channel == 4)
  210. {
  211. tmr_channel_enable(tmr_x, TMR_SELECT_CHANNEL_4, TRUE);
  212. }
  213. }
  214. }
  215. else
  216. {
  217. if (!enable)
  218. {
  219. if(channel == 1)
  220. {
  221. tmr_channel_enable(tmr_x, TMR_SELECT_CHANNEL_1C, FALSE);
  222. }
  223. else if(channel == 2)
  224. {
  225. tmr_channel_enable(tmr_x, TMR_SELECT_CHANNEL_2C, FALSE);
  226. }
  227. else if(channel == 3)
  228. {
  229. tmr_channel_enable(tmr_x, TMR_SELECT_CHANNEL_3C, FALSE);
  230. }
  231. }
  232. else
  233. {
  234. if(channel == 1)
  235. {
  236. tmr_channel_enable(tmr_x, TMR_SELECT_CHANNEL_1C, TRUE);
  237. }
  238. else if(channel == 2)
  239. {
  240. tmr_channel_enable(tmr_x, TMR_SELECT_CHANNEL_2C, TRUE);
  241. }
  242. else if(channel == 3)
  243. {
  244. tmr_channel_enable(tmr_x, TMR_SELECT_CHANNEL_3C, TRUE);
  245. }
  246. }
  247. }
  248. /* tmr_x enable counter */
  249. tmr_counter_enable(tmr_x, TRUE);
  250. return RT_EOK;
  251. }
  252. static rt_err_t drv_pwm_get(tmr_type* tmr_x, struct rt_pwm_configuration *configuration)
  253. {
  254. crm_clocks_freq_type clocks_struct;
  255. rt_uint32_t pr, div, c1dt, c2dt, c3dt, c4dt, tmr_clock;
  256. rt_uint32_t pclk1_doubler = 0, pclk2_doubler = 0;
  257. rt_uint32_t channel = configuration->channel;
  258. pr = tmr_x->pr;
  259. div = tmr_x->div;
  260. c1dt = tmr_x->c1dt;
  261. c2dt = tmr_x->c2dt;
  262. c3dt = tmr_x->c3dt;
  263. c4dt = tmr_x->c4dt;
  264. tmr_pclk_get(&pclk1_doubler, &pclk2_doubler);
  265. crm_clocks_freq_get(&clocks_struct);
  266. if(
  267. #if defined (TMR1)
  268. (tmr_x == TMR1)
  269. #endif
  270. #if defined (TMR8)
  271. || (tmr_x == TMR8)
  272. #endif
  273. #if defined (TMR9)
  274. || (tmr_x == TMR9)
  275. #endif
  276. #if defined (TMR10)
  277. || (tmr_x == TMR10)
  278. #endif
  279. #if defined (TMR11)
  280. || (tmr_x == TMR11)
  281. #endif
  282. )
  283. {
  284. tmr_clock = clocks_struct.apb2_freq * pclk2_doubler;
  285. }
  286. else
  287. {
  288. tmr_clock = clocks_struct.apb1_freq * pclk1_doubler;
  289. }
  290. /* convert nanosecond to frequency and duty cycle. */
  291. tmr_clock /= 1000000UL;
  292. configuration->period = (pr + 1) * (div + 1) * 1000UL / tmr_clock;
  293. if(channel == 1)
  294. configuration->pulse = (c1dt) * (div + 1) * 1000UL / tmr_clock;
  295. if(channel == 2)
  296. configuration->pulse = (c2dt) * (div + 1) * 1000UL / tmr_clock;
  297. if(channel == 3)
  298. configuration->pulse = (c3dt) * (div + 1) * 1000UL / tmr_clock;
  299. if(channel == 4)
  300. configuration->pulse = (c4dt) * (div + 1) * 1000UL / tmr_clock;
  301. return RT_EOK;
  302. }
  303. static rt_err_t drv_pwm_set(tmr_type* tmr_x, struct rt_pwm_configuration *configuration)
  304. {
  305. crm_clocks_freq_type clocks_struct;
  306. tmr_channel_select_type channel_select;
  307. rt_uint32_t period, pulse, channel, psc, tmr_clock;
  308. rt_uint32_t pclk1_doubler = 0, pclk2_doubler = 0;
  309. tmr_pclk_get(&pclk1_doubler, &pclk2_doubler);
  310. crm_clocks_freq_get(&clocks_struct);
  311. if(
  312. #if defined (TMR1)
  313. (tmr_x == TMR1)
  314. #endif
  315. #if defined (TMR8)
  316. || (tmr_x == TMR8)
  317. #endif
  318. #if defined (TMR9)
  319. || (tmr_x == TMR9)
  320. #endif
  321. #if defined (TMR10)
  322. || (tmr_x == TMR10)
  323. #endif
  324. #if defined (TMR11)
  325. || (tmr_x == TMR11)
  326. #endif
  327. )
  328. {
  329. tmr_clock = clocks_struct.apb2_freq * pclk2_doubler;
  330. }
  331. else
  332. {
  333. tmr_clock = clocks_struct.apb1_freq * pclk1_doubler;
  334. }
  335. /* convert nanosecond to frequency and duty cycle. */
  336. tmr_clock /= 1000000UL;
  337. /* calculate pwm period */
  338. period = (unsigned long long)configuration->period * tmr_clock / 1000ULL;;
  339. psc = period / MAX_PERIOD + 1;
  340. period = period / psc;
  341. tmr_div_value_set(tmr_x, psc - 1);
  342. if(period < MIN_PERIOD)
  343. {
  344. period = MIN_PERIOD;
  345. }
  346. tmr_period_value_set(tmr_x, period - 1);
  347. /* calculate pulse width */
  348. pulse = (unsigned long long)configuration->pulse * tmr_clock / psc / 1000ULL;
  349. if(pulse < MIN_PULSE)
  350. {
  351. pulse = MIN_PULSE;
  352. }
  353. else if(pulse >= period)
  354. {
  355. pulse = period + 1;
  356. }
  357. /* get channel parameter */
  358. channel = configuration->channel;
  359. if(channel == 1)
  360. {
  361. channel_select = TMR_SELECT_CHANNEL_1;
  362. }
  363. else if(channel == 2)
  364. {
  365. channel_select = TMR_SELECT_CHANNEL_2;
  366. }
  367. else if(channel == 3)
  368. {
  369. channel_select = TMR_SELECT_CHANNEL_3;
  370. }
  371. else if(channel == 4)
  372. {
  373. channel_select = TMR_SELECT_CHANNEL_4;
  374. }
  375. tmr_channel_value_set(tmr_x, channel_select, pulse);
  376. /* if you want the pwm setting to take effect immediately,
  377. please uncommon the following code, but it will cause the last pwm cycle not complete. */
  378. //tmr_counter_value_set(tmr_x, 0);
  379. //tmr_x->swevt_bit.ovfswtr = TRUE;
  380. return RT_EOK;
  381. }
  382. static rt_err_t drv_pwm_set_period(tmr_type* tmr_x, struct rt_pwm_configuration *configuration)
  383. {
  384. crm_clocks_freq_type clocks_struct;
  385. rt_uint32_t period, psc, tmr_clock;
  386. rt_uint32_t pclk1_doubler = 0, pclk2_doubler = 0;
  387. tmr_pclk_get(&pclk1_doubler, &pclk2_doubler);
  388. crm_clocks_freq_get(&clocks_struct);
  389. if(
  390. #if defined (TMR1)
  391. (tmr_x == TMR1)
  392. #endif
  393. #if defined (TMR8)
  394. || (tmr_x == TMR8)
  395. #endif
  396. #if defined (TMR9)
  397. || (tmr_x == TMR9)
  398. #endif
  399. #if defined (TMR10)
  400. || (tmr_x == TMR10)
  401. #endif
  402. #if defined (TMR11)
  403. || (tmr_x == TMR11)
  404. #endif
  405. )
  406. {
  407. tmr_clock = clocks_struct.apb2_freq * pclk2_doubler;
  408. }
  409. else
  410. {
  411. tmr_clock = clocks_struct.apb1_freq * pclk1_doubler;
  412. }
  413. /* convert nanosecond to frequency and duty cycle. */
  414. tmr_clock /= 1000000UL;
  415. /* calculate pwm period */
  416. period = (unsigned long long)configuration->period * tmr_clock / 1000ULL;;
  417. psc = period / MAX_PERIOD + 1;
  418. period = period / psc;
  419. tmr_div_value_set(tmr_x, psc - 1);
  420. if(period < MIN_PERIOD)
  421. {
  422. period = MIN_PERIOD;
  423. }
  424. tmr_period_value_set(tmr_x, period - 1);
  425. return RT_EOK;
  426. }
  427. static rt_err_t drv_pwm_set_pulse(tmr_type* tmr_x, struct rt_pwm_configuration *configuration)
  428. {
  429. crm_clocks_freq_type clocks_struct;
  430. tmr_channel_select_type channel_select;
  431. rt_uint32_t period, pulse, channel, psc, tmr_clock;
  432. rt_uint32_t pclk1_doubler = 0, pclk2_doubler = 0;
  433. tmr_pclk_get(&pclk1_doubler, &pclk2_doubler);
  434. crm_clocks_freq_get(&clocks_struct);
  435. if(
  436. #if defined (TMR1)
  437. (tmr_x == TMR1)
  438. #endif
  439. #if defined (TMR8)
  440. || (tmr_x == TMR8)
  441. #endif
  442. #if defined (TMR9)
  443. || (tmr_x == TMR9)
  444. #endif
  445. #if defined (TMR10)
  446. || (tmr_x == TMR10)
  447. #endif
  448. #if defined (TMR11)
  449. || (tmr_x == TMR11)
  450. #endif
  451. )
  452. {
  453. tmr_clock = clocks_struct.apb2_freq * pclk2_doubler;
  454. }
  455. else
  456. {
  457. tmr_clock = clocks_struct.apb1_freq * pclk1_doubler;
  458. }
  459. /* convert nanosecond to frequency and duty cycle. */
  460. tmr_clock /= 1000000UL;
  461. /* calculate pwm period */
  462. period = (unsigned long long)configuration->period * tmr_clock / 1000ULL;;
  463. psc = period / MAX_PERIOD + 1;
  464. /* calculate pulse width */
  465. pulse = (unsigned long long)configuration->pulse * tmr_clock / psc / 1000ULL;
  466. if(pulse < MIN_PULSE)
  467. {
  468. pulse = MIN_PULSE;
  469. }
  470. else if(pulse >= period)
  471. {
  472. pulse = period + 1;
  473. }
  474. /* get channel parameter */
  475. channel = configuration->channel;
  476. if(channel == 1)
  477. {
  478. channel_select = TMR_SELECT_CHANNEL_1;
  479. }
  480. else if(channel == 2)
  481. {
  482. channel_select = TMR_SELECT_CHANNEL_2;
  483. }
  484. else if(channel == 3)
  485. {
  486. channel_select = TMR_SELECT_CHANNEL_3;
  487. }
  488. else if(channel == 4)
  489. {
  490. channel_select = TMR_SELECT_CHANNEL_4;
  491. }
  492. tmr_channel_value_set(tmr_x, channel_select, pulse);
  493. return RT_EOK;
  494. }
  495. static rt_err_t drv_pwm_control(struct rt_device_pwm *device, int cmd, void *arg)
  496. {
  497. struct rt_pwm_configuration *configuration = (struct rt_pwm_configuration *)arg;
  498. tmr_type *tmr_x = (tmr_type *)device->parent.user_data;
  499. switch (cmd)
  500. {
  501. case PWM_CMD_ENABLE:
  502. return drv_pwm_enable(tmr_x, configuration, RT_TRUE);
  503. case PWM_CMD_DISABLE:
  504. return drv_pwm_enable(tmr_x, configuration, RT_FALSE);
  505. case PWM_CMD_SET:
  506. return drv_pwm_set(tmr_x, configuration);
  507. case PWM_CMD_SET_PERIOD:
  508. return drv_pwm_set_period(tmr_x, configuration);
  509. case PWM_CMD_SET_PULSE:
  510. return drv_pwm_set_pulse(tmr_x, configuration);
  511. case PWM_CMD_GET:
  512. return drv_pwm_get(tmr_x, configuration);
  513. default:
  514. return -RT_EINVAL;
  515. }
  516. }
  517. static void pwm_get_channel(void)
  518. {
  519. #ifdef BSP_USING_PWM1_CH1
  520. at32_pwm_obj[PWM1_INDEX].channel |= 1 << 0;
  521. #endif
  522. #ifdef BSP_USING_PWM1_CH2
  523. at32_pwm_obj[PWM1_INDEX].channel |= 1 << 1;
  524. #endif
  525. #ifdef BSP_USING_PWM1_CH3
  526. at32_pwm_obj[PWM1_INDEX].channel |= 1 << 2;
  527. #endif
  528. #ifdef BSP_USING_PWM1_CH4
  529. at32_pwm_obj[PWM1_INDEX].channel |= 1 << 3;
  530. #endif
  531. #ifdef BSP_USING_PWM2_CH1
  532. at32_pwm_obj[PWM2_INDEX].channel |= 1 << 0;
  533. #endif
  534. #ifdef BSP_USING_PWM2_CH2
  535. at32_pwm_obj[PWM2_INDEX].channel |= 1 << 1;
  536. #endif
  537. #ifdef BSP_USING_PWM2_CH3
  538. at32_pwm_obj[PWM2_INDEX].channel |= 1 << 2;
  539. #endif
  540. #ifdef BSP_USING_PWM2_CH4
  541. at32_pwm_obj[PWM2_INDEX].channel |= 1 << 3;
  542. #endif
  543. #ifdef BSP_USING_PWM3_CH1
  544. at32_pwm_obj[PWM3_INDEX].channel |= 1 << 0;
  545. #endif
  546. #ifdef BSP_USING_PWM3_CH2
  547. at32_pwm_obj[PWM3_INDEX].channel |= 1 << 1;
  548. #endif
  549. #ifdef BSP_USING_PWM3_CH3
  550. at32_pwm_obj[PWM3_INDEX].channel |= 1 << 2;
  551. #endif
  552. #ifdef BSP_USING_PWM3_CH4
  553. at32_pwm_obj[PWM3_INDEX].channel |= 1 << 3;
  554. #endif
  555. #ifdef BSP_USING_PWM4_CH1
  556. at32_pwm_obj[PWM4_INDEX].channel |= 1 << 0;
  557. #endif
  558. #ifdef BSP_USING_PWM4_CH2
  559. at32_pwm_obj[PWM4_INDEX].channel |= 1 << 1;
  560. #endif
  561. #ifdef BSP_USING_PWM4_CH3
  562. at32_pwm_obj[PWM4_INDEX].channel |= 1 << 2;
  563. #endif
  564. #ifdef BSP_USING_PWM4_CH4
  565. at32_pwm_obj[PWM4_INDEX].channel |= 1 << 3;
  566. #endif
  567. #ifdef BSP_USING_PWM5_CH1
  568. at32_pwm_obj[PWM5_INDEX].channel |= 1 << 0;
  569. #endif
  570. #ifdef BSP_USING_PWM5_CH2
  571. at32_pwm_obj[PWM5_INDEX].channel |= 1 << 1;
  572. #endif
  573. #ifdef BSP_USING_PWM5_CH3
  574. at32_pwm_obj[PWM5_INDEX].channel |= 1 << 2;
  575. #endif
  576. #ifdef BSP_USING_PWM5_CH4
  577. at32_pwm_obj[PWM5_INDEX].channel |= 1 << 3;
  578. #endif
  579. #ifdef BSP_USING_PWM6_CH1
  580. at32_pwm_obj[PWM6_INDEX].channel |= 1 << 0;
  581. #endif
  582. #ifdef BSP_USING_PWM6_CH2
  583. at32_pwm_obj[PWM6_INDEX].channel |= 1 << 1;
  584. #endif
  585. #ifdef BSP_USING_PWM6_CH3
  586. at32_pwm_obj[PWM6_INDEX].channel |= 1 << 2;
  587. #endif
  588. #ifdef BSP_USING_PWM6_CH4
  589. at32_pwm_obj[PWM6_INDEX].channel |= 1 << 3;
  590. #endif
  591. #ifdef BSP_USING_PWM7_CH1
  592. at32_pwm_obj[PWM7_INDEX].channel |= 1 << 0;
  593. #endif
  594. #ifdef BSP_USING_PWM7_CH2
  595. at32_pwm_obj[PWM7_INDEX].channel |= 1 << 1;
  596. #endif
  597. #ifdef BSP_USING_PWM7_CH3
  598. at32_pwm_obj[PWM7_INDEX].channel |= 1 << 2;
  599. #endif
  600. #ifdef BSP_USING_PWM7_CH4
  601. at32_pwm_obj[PWM7_INDEX].channel |= 1 << 3;
  602. #endif
  603. #ifdef BSP_USING_PWM8_CH1
  604. at32_pwm_obj[PWM8_INDEX].channel |= 1 << 0;
  605. #endif
  606. #ifdef BSP_USING_PWM8_CH2
  607. at32_pwm_obj[PWM8_INDEX].channel |= 1 << 1;
  608. #endif
  609. #ifdef BSP_USING_PWM8_CH3
  610. at32_pwm_obj[PWM8_INDEX].channel |= 1 << 2;
  611. #endif
  612. #ifdef BSP_USING_PWM8_CH4
  613. at32_pwm_obj[PWM8_INDEX].channel |= 1 << 3;
  614. #endif
  615. #ifdef BSP_USING_PWM9_CH1
  616. at32_pwm_obj[PWM9_INDEX].channel |= 1 << 0;
  617. #endif
  618. #ifdef BSP_USING_PWM9_CH2
  619. at32_pwm_obj[PWM9_INDEX].channel |= 1 << 1;
  620. #endif
  621. #ifdef BSP_USING_PWM9_CH3
  622. at32_pwm_obj[PWM9_INDEX].channel |= 1 << 2;
  623. #endif
  624. #ifdef BSP_USING_PWM9_CH4
  625. at32_pwm_obj[PWM9_INDEX].channel |= 1 << 3;
  626. #endif
  627. #ifdef BSP_USING_PWM12_CH1
  628. at32_pwm_obj[PWM12_INDEX].channel |= 1 << 0;
  629. #endif
  630. #ifdef BSP_USING_PWM12_CH2
  631. at32_pwm_obj[PWM12_INDEX].channel |= 1 << 1;
  632. #endif
  633. }
  634. static int rt_hw_pwm_init(void)
  635. {
  636. int i = 0;
  637. int result = RT_EOK;
  638. pwm_get_channel();
  639. for(i = 0; i < sizeof(at32_pwm_obj) / sizeof(at32_pwm_obj[0]); i++)
  640. {
  641. if(at32_hw_pwm_init(&at32_pwm_obj[i]) != RT_EOK)
  642. {
  643. LOG_E("%s init failed", at32_pwm_obj[i].name);
  644. result = -RT_ERROR;
  645. goto __exit;
  646. }
  647. else
  648. {
  649. if(rt_device_pwm_register(&at32_pwm_obj[i].pwm_device, at32_pwm_obj[i].name, &drv_ops, at32_pwm_obj[i].tmr_x) == RT_EOK)
  650. {
  651. LOG_D("%s register success", at32_pwm_obj[i].name);
  652. }
  653. else
  654. {
  655. LOG_D("%s register failed", at32_pwm_obj[i].name);
  656. result = -RT_ERROR;
  657. }
  658. }
  659. }
  660. __exit:
  661. return result;
  662. }
  663. INIT_BOARD_EXPORT(rt_hw_pwm_init);
  664. #endif /* RT_USING_PWM */