pwm_led.c 53 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765
  1. /* #define __LOG_LEVEL __LOG_WARN */
  2. /*#define __LOG_LEVEL __LOG_DEBUG*/
  3. /*#define __LOG_LEVEL __LOG_VERBOSE*/
  4. #define __LOG_LEVEL __LOG_INFO
  5. #include "generic/gpio.h"
  6. #include "asm/includes.h"
  7. #include "asm/pwm_led.h"
  8. #include "asm/power/p11.h"
  9. #include "asm/power/p33.h"
  10. #include "system/timer.h"
  11. #include "app_config.h"
  12. #include "classic/tws_api.h"
  13. /*******************************************************************
  14. * 推灯注意事项:
  15. * 1)PWM_CON1的BIT(4), OUT_LOGIC位一定要设置为1;
  16. * 2)PWM_CON1的BIT(0), PWM0_INV位一定要设置为0;
  17. * 3)在非呼吸灯效果下, 单IO双LED模式, PWM_PRD_DIV寄存器和PWM_BRI_PRD设置成相同值;
  18. * 4)在闪灯模式下, PWM_BRI_PRD(亮度值)固定下来后, PWM0的BRI_DUTY0和BRI_DUTY1一定不能超过PWM_BRI_PRD;
  19. *********************************************************************/
  20. /* #ifdef SUPPORT_MS_EXTENSIONS */
  21. /* #pragma bss_seg( ".pwm_led_bss") */
  22. /* #pragma data_seg( ".pwm_led_data") */
  23. /* #pragma const_seg( ".pwm_led_const") */
  24. /* #pragma code_seg( ".pwm_led_code") */
  25. /* #endif */
  26. //#define PWM_LED_TEST_MODE //LED模块测试函数
  27. //#define PWM_LED_DEBUG_ENABLE
  28. #ifdef PWM_LED_DEBUG_ENABLE
  29. #define led_debug(fmt, ...) g_printf("[PWM_LED] "fmt, ##__VA_ARGS__)
  30. #define led_err(fmt, ...) r_printf("[PWM_LED_ERR] "fmt, ##__VA_ARGS__)
  31. #define led_putchar(a) putchar(a)
  32. #else
  33. #define led_debug(...)
  34. #define led_err(...)
  35. #define led_putchar(...)
  36. #endif
  37. //////////////////////////////////////////////////////////////
  38. #define PWM_LED_SFR SFR
  39. //========================= 0.模块开关相关寄存器
  40. #define LED_PWM_ENABLE (JL_PLED->CON0 |= BIT(0))
  41. #define LED_PWM_DISABLE (JL_PLED->CON0 &= ~BIT(0))
  42. #define IS_PWM_LED_ON (JL_PLED->CON0 & BIT(0))
  43. #define RESET_PWM_CON0 (JL_PLED->CON0 = 0)
  44. #define RESET_PWM_CON1 (JL_PLED->CON1 = 0)
  45. #define RESET_PWM_CON2 (JL_PLED->CON2 = 0)
  46. #define RESET_PWM_CON3 (JL_PLED->CON3 = 0)
  47. //========================= 1.时钟设置相关寄存器
  48. //PWM0 CLK DIV
  49. #define CLK_DIV_1 0
  50. #define CLK_DIV_4 1
  51. #define CLK_DIV_16 2
  52. #define CLK_DIV_64 3
  53. #define CLK_DIV_x2(x) (0x04 | x)
  54. #define CLK_DIV_x256(x) (0x08 | x)
  55. #define CLK_DIV_x2_x256(x) (0x0c | x)
  56. //SOURCE
  57. #define LED_PWM0_CLK_SOURCE(x) PWM_LED_SFR(JL_PLED->CON0, 2, 2, x)
  58. //SOURCE -- DIV --> PWM0
  59. //[1:0] 00:div1 01:div4 10:div16 11:div64
  60. //[2]: 0:x1 1:x2
  61. //[3]: 0:x1 1:x256
  62. //DIV = [1:0] * [2] * [3]
  63. #define LED_PWM0_CLK_DIV(x) PWM_LED_SFR(JL_PLED->CON0, 4, 4, x)
  64. //PWM0 -- DIV --> PWM1
  65. //PWM_CON3[3:0] -- PWM_PRD_DIVL[7:0] //12bit
  66. #define LED_PWM1_CLK_DIV(x) {do {JL_PLED->PRD_DIVL = ((x-1) & 0xFF); JL_PLED->CON3 &= ~(0xF); JL_PLED->CON3 |= (((x-1) >> 8) & 0xF);} while(0);}
  67. //========================= 2.亮度设置相关寄存器
  68. //最高亮度级数设置
  69. //PWM_BRI_PRDH[1:0] -- PWM_BRI_PRDL[7:0] //10bit
  70. #define LED_BRI_DUTY_CYCLE(x) {do {JL_PLED->BRI_PRDL = (x & 0xFF); JL_PLED->BRI_PRDH = ((x >> 8) & 0x3);} while(0);}
  71. //高电平亮灯亮度设置
  72. #define LED_BRI_DUTY1_SET(x) {do {JL_PLED->BRI_DUTY0L = (x & 0xFF); JL_PLED->BRI_DUTY0H = ((x >> 8) & 0x3);} while(0);}
  73. //低电平亮灯亮度设置
  74. #define LED_BRI_DUTY0_SET(x) {do {JL_PLED->BRI_DUTY1L = (x & 0xFF); JL_PLED->BRI_DUTY1H = ((x >> 8) & 0x3);} while(0);}
  75. //同步LED0 <-- LED1亮度
  76. #define LED_BRI_DUTY0_SYNC1() {do {JL_PLED->BRI_DUTY0L = JL_PLED->BRI_DUTY1L; JL_PLED->BRI_DUTY0H = JL_PLED->BRI_DUTY1H;} while(0);}
  77. //同步LED1 <-- LED0亮度
  78. #define LED_BRI_DUTY1_SYNC0() {do {JL_PLED->BRI_DUTY1L = JL_PLED->BRI_DUTY0L; JL_PLED->BRI_DUTY1H = JL_PLED->BRI_DUTY0H;} while(0);}
  79. //========================= 3.亮灭设置相关寄存器
  80. //duty_cycle 固定为255或者设置PWM_DUTY3, 8bit
  81. // _duty1_ _duty3_
  82. // | | | |
  83. // | | | |
  84. //0__ __ duty0| | __ duty2| |__ __255/PWM_DUTY3
  85. //PWM1 duty_cycle 选择
  86. #define LED_PWM1_DUTY_FIX_SET (JL_PLED->CON1 &= ~BIT(3)) //固定PWM1周期为0xFF
  87. #define LED_PWM1_DUTY_VARY_SET(x) {do {JL_PLED->CON1 |= BIT(3); JL_PLED->DUTY3 = x;} while(0);}
  88. #define LED_PWM1_DUTY0_SET(x) (JL_PLED->DUTY0 = x)
  89. #define LED_PWM1_DUTY1_SET(x) (JL_PLED->DUTY1 = x)
  90. #define LED_PWM1_DUTY2_SET(x) (JL_PLED->DUTY2 = x)
  91. #define LED_PWM1_DUTY3_SET(x) (JL_PLED->DUTY3 = x) //可以设置为PWM1_DUTY_CYCLE
  92. #define LED_PWM1_PRD_SEL_DIS (JL_PLED->CON1 &= ~BIT(3))
  93. #define LED_PWM1_PRD_SEL_EN (JL_PLED->CON1 |= BIT(3))
  94. #define LED_PWM1_DUTY0_EN (JL_PLED->CON1 |= BIT(4))
  95. #define LED_PWM1_DUTY1_EN (JL_PLED->CON1 |= BIT(5))
  96. #define LED_PWM1_DUTY2_EN (JL_PLED->CON1 |= BIT(6))
  97. #define LED_PWM1_DUTY3_EN (JL_PLED->CON1 |= BIT(7))
  98. #define LED_PWM1_ALL_DUTY_DIS (JL_PLED->CON1 &= ~(0xF << 4))
  99. #define LED_PWM1_DUTY0_DIS (JL_PLED->CON1 &= ~BIT(4))
  100. #define LED_PWM1_DUTY1_DIS (JL_PLED->CON1 &= ~BIT(5))
  101. #define LED_PWM1_DUTY2_DIS (JL_PLED->CON1 &= ~BIT(6))
  102. #define LED_PWM1_DUTY3_DIS (JL_PLED->CON1 &= ~BIT(7))
  103. //========================= 5.输出取反相关寄存器
  104. //以下几个需要设置为固定值
  105. #define LED_PWM0_INV_DISABLE (JL_PLED->CON1 &= ~BIT(0))
  106. #define LED_PWM1_INV_DISABLE (JL_PLED->CON1 &= ~BIT(1)) //周期从灭灯开始
  107. #define LED_PWM1_INV_ENABLE (JL_PLED->CON1 |= BIT(1)) //周期从亮灯开始
  108. #define LED_PWM_OUT_LOGIC_SET (JL_PLED->CON3 |= BIT(4))
  109. //以下几个可以灵活设置
  110. #define LED_PWM_OUTPUT_INV_ENABLE (JL_PLED->CON1 |= BIT(2))
  111. #define LED_PWM_OUTPUT_INV_DISABLE (JL_PLED->CON1 &= ~BIT(2))
  112. //========================= 6.与周期变色相关寄存器
  113. #define LED_PWM_SHIFT_DUTY_SET(x) PWM_LED_SFR(JL_PLED->CON2, 4, 4, x)
  114. //========================= 7.与驱动强度相关寄存器
  115. #define LED_PWM_IO_MAX_DRIVE(x) PWM_LED_SFR(JL_PLED->CON2, 0, 2, x)
  116. //========================= 8.与中断相关寄存器
  117. #define LED_PWM_INT_EN (JL_PLED->CON3 |= BIT(5))
  118. #define LED_PWM_INT_DIS (JL_PLED->CON3 &= ~BIT(5))
  119. #define LED_PWM_CLR_PENDING (JL_PLED->CON3 |= BIT(6))
  120. //========================= 9.与呼吸模式相关寄存器
  121. #define LED_PWM_BREATHE_ENABLE (JL_PLED->CON0 |= BIT(1))
  122. #define LED_PWM_BREATHE_DISABLE (JL_PLED->CON0 &= ~BIT(1))
  123. //LED呼吸灭灯延时设置, 16bit
  124. #define LED_PWM_BREATHE_BLANK_TIME_SET(x) {do {LED_PWM1_DUTY2_EN; LED_PWM1_DUTY3_EN; LED_PWM1_DUTY2_SET((x & 0xFF)); LED_PWM1_DUTY3_SET((x >> 8) & 0xFF)} while(0)}
  125. //LED呼吸灯(低电平灯)最高亮度延时设置, 8bit
  126. #define LED0_PWM_BREATHE_LIGHT_TIME_SET(x) {do {LED_PWM1_DUTY0_EN; LED_PWM1_DUTY0_SET(x)} while(0)}
  127. //LED呼吸灯(高电平灯)最高亮度延时设置, 8bit
  128. #define LED1_PWM_BREATHE_LIGHT_TIME_SET(x) {do {LED_PWM1_DUTY1_EN; LED_PWM1_DUTY1_SET(x)} while(0)}
  129. struct pwm_led {
  130. u8 init;
  131. u8 led_pin;
  132. u8 clock;
  133. u8 last_mode;
  134. const struct led_platform_data *user_data;
  135. //中断相关
  136. void (*pwm_led_extern_isr)(void);
  137. void (*pwm_led_local_isr)(void);
  138. #ifdef PWM_LED_TWO_IO_SUPPORT
  139. u8 display_index;
  140. u8 display_bit;
  141. #endif /* #ifdef PWM_LED_TWO_IO_SUPPORT */
  142. };
  143. enum _PWM0_CLK {
  144. PWM0_CLK_32K, //for rc normal
  145. //BT24M
  146. PWM0_CLK_46K, //24M / 512 = 46875, for normal period < 22s
  147. PWM0_CLK_23K, //24M / 1024 = 23437, for normal period > 22s
  148. };
  149. #define PWM0_RC_CLK32K_VALUE 32000
  150. #define PWM0_BT_CLK23K_VALUE 23437
  151. #define PWM0_BT_CLK46K_VALUE 46875
  152. #define PWM_LED_USER_DEFINE_MODE 0xFE
  153. static struct pwm_led _led;
  154. #define __this (&_led)
  155. static void _pwm_led_display_mode(u8 display);
  156. static void _led_pwm1_duty_set(u8 duty_prd, u8 duty0, u8 duty1, u8 duty2, u8 breathe);
  157. static void pwm_led_16slot_timer_free(void);
  158. static void pwm_led_one_io_mode_slot_timer_display(u8 display);
  159. static bool led_module_is_in_sniff_mode();
  160. /*
  161. //=================================================================================//
  162. //BD19: LED clock select
  163. __ 0: for save power
  164. |
  165. |__ 1: rc_250K
  166. |
  167. |__ 2: rc_16M
  168. ___ 0: LED CLK MUX <-- |
  169. | |__ 3: lrc_osc
  170. |___ 1: STD_24M |
  171. | |__ 4: rtc_osc
  172. led source clock <---| |
  173. | |__ 5: sys_clk
  174. |___ 2: BT_OSC_24M P11_P2M_CLK_CON0[7:5]
  175. |
  176. |
  177. |___ 3: PAT_CLK
  178. PWM_CON0[3:2]
  179. // P11_P2M_CLK_CON0[7 : 5]:
  180. // 000: led clk fix connect to vdd(reserved);
  181. // 001: RC_250K, open @ P3_ANA_CON0[7];
  182. // 010: RC_16M, open @ P11_CLK_CON0[1];
  183. // 011: LRC_OSC_32K, open @ P3_LRC_CON0[0];
  184. // 100: RTC_OSC;
  185. // 101: SYS_CLK;
  186. //=================================================================================//
  187. */
  188. static void pwm_clock_set(u8 _clock)
  189. {
  190. u8 clock = _clock;
  191. u8 clk_val = 0;
  192. u8 con0_val = 0;
  193. switch (clock) {
  194. case PWM_LED_CLK_RC32K:
  195. //RC_32K
  196. clk_val = 0b011;
  197. con0_val = 0b00;
  198. //MO Note: Make sure P11 part have been patch key
  199. P11_P2M_CLK_CON0 &= ~(0b111 << 5);
  200. P11_P2M_CLK_CON0 |= (clk_val << 5);
  201. break;
  202. case PWM_LED_CLK_STD_24M:
  203. case PWM_LED_CLK_BTOSC_24M:
  204. //con0_val = 0b10;
  205. con0_val = 0b01; //for test
  206. break;
  207. case PWM_LED_CLK_PAT_CLK:
  208. con0_val = 0b11;
  209. break;
  210. default:
  211. break;
  212. }
  213. LED_PWM0_CLK_SOURCE(con0_val);
  214. __this->clock = clock;
  215. led_debug("clock = 0x%x, clk_val= %d, con0_val = %d, P11_P2M_CLK_CON0 = 0x%x", __this->clock, clk_val, con0_val, ((P11_P2M_CLK_CON0 >> 5) & 0b111));
  216. }
  217. /*
  218. * IO使能注意, 否则有可能会出现在显示效果前会出现闪烁
  219. * 1)设置PU, PD为1;
  220. * 2)设置DIR, OUT为1;
  221. * 3)最后设置为方向为输出;
  222. */
  223. static void led_pin_set_enable(u8 gpio)
  224. {
  225. led_debug("led pin set enable = %d", gpio);
  226. CPU_CRITICAL_ENTER();
  227. u8 tmp = IS_PWM_LED_ON;
  228. LED_PWM_DISABLE; //防止切IO时模块在工作会有闪一下的现象
  229. gpio_set_pull_down(gpio, 1);
  230. gpio_set_die(gpio, 1);
  231. gpio_set_direction(gpio, 0);
  232. gpio_set_pull_up(gpio, 1);
  233. gpio_set_output_value(gpio, 1);
  234. if (tmp) {
  235. LED_PWM_ENABLE;
  236. }
  237. CPU_CRITICAL_EXIT();
  238. }
  239. //把IO设置为高阻
  240. static void led_pin_set_disable(u8 disable_pin)
  241. {
  242. led_debug("led pin set disable = %d", disable_pin);
  243. gpio_set_pull_up(disable_pin, 0);
  244. gpio_direction_input(disable_pin);
  245. gpio_set_pull_down(disable_pin, 0);
  246. gpio_set_output_value(disable_pin, 0);
  247. gpio_set_die(disable_pin, 0);
  248. }
  249. ___interrupt
  250. static void pwm_led_isr_func(void)
  251. {
  252. LED_PWM_CLR_PENDING;
  253. led_putchar('b');
  254. if (__this->pwm_led_extern_isr) {
  255. __this->pwm_led_extern_isr();
  256. }
  257. if (__this->pwm_led_local_isr) {
  258. __this->pwm_led_local_isr();
  259. }
  260. }
  261. //index = 1: 内部切IO中断;
  262. //index = 0: 外部注册中断;
  263. static void _pwm_led_register_irq(void (*func)(void), u8 index)
  264. {
  265. LED_PWM_INT_DIS;
  266. LED_PWM_CLR_PENDING;
  267. if (func) {
  268. if (index) {
  269. __this->pwm_led_local_isr = func;
  270. } else {
  271. __this->pwm_led_extern_isr = func;
  272. }
  273. request_irq(IRQ_PWM_LED_IDX, 1, pwm_led_isr_func, 0);
  274. LED_PWM_INT_EN;
  275. }
  276. }
  277. static void _pwm_led_close_irq(void)
  278. {
  279. __this->pwm_led_extern_isr = NULL;
  280. __this->pwm_led_local_isr = NULL;
  281. LED_PWM_INT_DIS;
  282. }
  283. void pwm_led_init(const struct led_platform_data *user_data)
  284. {
  285. led_debug("pwm led init ...");
  286. memset(__this, 0, sizeof(struct pwm_led));
  287. LED_PWM_DISABLE;
  288. LED_PWM_BREATHE_DISABLE; //呼吸灯使能位
  289. RESET_PWM_CON0;
  290. RESET_PWM_CON1;
  291. RESET_PWM_CON2;
  292. RESET_PWM_CON3;
  293. LED_PWM_OUT_LOGIC_SET;
  294. LED_PWM_CLR_PENDING;
  295. pwm_clock_set(PWM_LED_CLK_RC32K);
  296. //pwm_clock_set(PWM_LED_CLK_BTOSC_24M);
  297. if (user_data->io_mode == LED_ONE_IO_MODE) {
  298. __this->led_pin = user_data->io_cfg.one_io.pin;
  299. led_pin_set_enable(user_data->io_cfg.one_io.pin); //一个IO推两个灯
  300. }
  301. __this->user_data = user_data;
  302. __this->last_mode = PWM_LED_ALL_OFF;
  303. __this->init = 1;
  304. }
  305. void log_pwm_led_info()
  306. {
  307. led_debug("======== PWM LED CONFIG ======");
  308. led_debug("clock = 0x%x, P11_P2M_CLK_CON0 = 0x%x", __this->clock, ((P11_P2M_CLK_CON0 >> 5) & 0b111));
  309. led_debug("P3_LRC_CON0 = 0x%x", P3_LRC_CON0);
  310. led_debug("PWM_CON0 = 0x%x", JL_PLED->CON0);
  311. led_debug("PWM_CON1 = 0x%x", JL_PLED->CON1);
  312. led_debug("PWM_CON2 = 0x%x", JL_PLED->CON2);
  313. led_debug("PWM_CON3 = 0x%x", JL_PLED->CON3);
  314. led_debug("PRD_DIVL = 0x%x", JL_PLED->PRD_DIVL);
  315. led_debug("BRI_PRDL = 0x%x", JL_PLED->BRI_PRDL);
  316. led_debug("BRI_PRDH = 0x%x", JL_PLED->BRI_PRDH);
  317. led_debug("BRI_DUTY0L = 0x%x", JL_PLED->BRI_DUTY0L);
  318. led_debug("BRI_DUTY0H = 0x%x", JL_PLED->BRI_DUTY0H);
  319. led_debug("BRI_DUTY1L = 0x%x", JL_PLED->BRI_DUTY1L);
  320. led_debug("BRI_DUTY1H = 0x%x", JL_PLED->BRI_DUTY1H);
  321. led_debug("PWM1_DUTY0 = 0x%x", JL_PLED->DUTY0);
  322. led_debug("PWM1_DUTY1 = 0x%x", JL_PLED->DUTY1);
  323. led_debug("PWM1_DUTY2 = 0x%x", JL_PLED->DUTY2);
  324. led_debug("PWM1_DUTY3 = 0x%x", JL_PLED->DUTY3);
  325. led_debug("JL_PORTB->DIR = 0x%x", JL_PORTB->DIR);
  326. led_debug("JL_PORTB->OUT = 0x%x", JL_PORTB->OUT);
  327. led_debug("JL_PORTB->PU = 0x%x", JL_PORTB->PU);
  328. led_debug("JL_PORTB->PD = 0x%x", JL_PORTB->PD);
  329. led_debug("JL_PORTB->DIE = 0x%x", JL_PORTB->DIE);
  330. }
  331. /**
  332. * @brief: pwm0 时钟设置
  333. * 默认RC = 32K,
  334. * 呼吸BT24M = 93750Hz
  335. * 普通BT24M = 46875Hz/23437Hz
  336. *
  337. * @param: clk0
  338. * @return int
  339. */
  340. static int _led_pwm0_clk_set(enum _PWM0_CLK clk0)
  341. {
  342. u8 pwm0_clk_div_val = 0;
  343. if (__this->clock == PWM_LED_CLK_RC32K) {
  344. if (clk0 != PWM0_CLK_32K) {
  345. return -1;
  346. }
  347. //RC32k div 1 = 32k
  348. pwm0_clk_div_val = CLK_DIV_1;
  349. //RC16M div 512 = 32k
  350. /* pwm0_clk_div_val = CLK_DIV_x2(CLK_DIV_1) | CLK_DIV_x256(CLK_DIV_1); */
  351. //RC250K div 8 = 32k
  352. /* pwm0_clk_div_val = CLK_DIV_x2(CLK_DIV_4); */
  353. } else if (__this->clock == PWM_LED_CLK_BTOSC_24M) {
  354. #if 0 //CONFIG_FPGA_ENABLE
  355. //12M
  356. if (clk0 == PWM0_CLK_46K) {
  357. pwm0_clk_div_val = CLK_DIV_x256(CLK_DIV_1); //12M div 256 = 46875Hz
  358. } else if (clk0 == PWM0_CLK_23K) {
  359. pwm0_clk_div_val = CLK_DIV_x256(CLK_DIV_x2(CLK_DIV_1)); //12M div 512 = 23437Hz
  360. } else {
  361. return -1;
  362. }
  363. #else
  364. if (clk0 == PWM0_CLK_46K) {
  365. pwm0_clk_div_val = CLK_DIV_x256(CLK_DIV_x2(CLK_DIV_1)); //24M div 512 = 46875Hz
  366. } else if (clk0 == PWM0_CLK_23K) {
  367. pwm0_clk_div_val = CLK_DIV_x256(CLK_DIV_4); //24M div 1024 = 23437Hz
  368. } else {
  369. return -1;
  370. }
  371. #endif /* #if CONFIG_FPGA_ENABLE */
  372. }
  373. LED_PWM0_CLK_DIV(pwm0_clk_div_val);
  374. return 0;
  375. }
  376. static void led_pwm_pre_set()
  377. {
  378. LED_PWM_DISABLE;
  379. LED_PWM_BREATHE_DISABLE;
  380. }
  381. #ifdef PWM_LED_TWO_IO_SUPPORT
  382. static void _change_io_display(void)
  383. {
  384. u8 disable_pin = 0;
  385. u8 enable_pin = 0;
  386. if (__this->display_index == 0) {
  387. if (__this->display_bit == 0) {
  388. enable_pin = __this->user_data->io_cfg.two_io.pin1;
  389. disable_pin = __this->user_data->io_cfg.two_io.pin0;
  390. } else {
  391. enable_pin = __this->user_data->io_cfg.three_io.pin2;
  392. if (__this->display_bit & BIT(0)) {
  393. disable_pin = __this->user_data->io_cfg.three_io.pin0;
  394. } else if (__this->display_bit & BIT(1)) {
  395. disable_pin = __this->user_data->io_cfg.three_io.pin1;
  396. }
  397. }
  398. __this->display_index = 1;
  399. } else {
  400. if (__this->display_bit == 0) {
  401. enable_pin = __this->user_data->io_cfg.two_io.pin0;
  402. disable_pin = __this->user_data->io_cfg.two_io.pin1;
  403. } else {
  404. disable_pin = __this->user_data->io_cfg.three_io.pin2;
  405. if (__this->display_bit & BIT(0)) {
  406. enable_pin = __this->user_data->io_cfg.three_io.pin0;
  407. } else if (__this->display_bit & BIT(1)) {
  408. enable_pin = __this->user_data->io_cfg.three_io.pin1;
  409. }
  410. }
  411. __this->display_index = 0;
  412. }
  413. led_pin_set_disable(disable_pin);
  414. led_pin_set_enable(enable_pin);
  415. }
  416. static void pwm_led_two_io_mode_display(u8 display)
  417. {
  418. u8 change_mode = 0;
  419. u8 isr_mode = 0;
  420. u8 led2_enable = 0;
  421. __this->display_bit = 0;
  422. led_pin_set_disable(__this->user_data->io_cfg.two_io.pin0);
  423. led_pin_set_disable(__this->user_data->io_cfg.two_io.pin1);
  424. if (__this->user_data->io_mode == LED_THREE_IO_MODE) {
  425. led_pin_set_disable(__this->user_data->io_cfg.three_io.pin2);
  426. }
  427. #if (PWM_LED_TWO_IO_CONNECT == 0)
  428. switch (display) {
  429. case PWM_LED_ALL_OFF:
  430. case PWM_LED0_OFF:
  431. case PWM_LED1_OFF:
  432. _pwm_led_display_mode(PWM_LED_ALL_OFF);
  433. break;
  434. case PWM_LED1_ON:
  435. case PWM_LED1_SLOW_FLASH:
  436. case PWM_LED1_FAST_FLASH:
  437. case PWM_LED1_ONE_FLASH_5S:
  438. case PWM_LED1_DOUBLE_FLASH_5S:
  439. case PWM_LED1_BREATHE:
  440. led_pin_set_enable(__this->user_data->io_cfg.two_io.pin1);
  441. _pwm_led_display_mode(display);
  442. break;
  443. case PWM_LED0_ON:
  444. change_mode = PWM_LED1_ON;
  445. break;
  446. case PWM_LED0_SLOW_FLASH:
  447. change_mode = PWM_LED1_SLOW_FLASH;
  448. break;
  449. case PWM_LED0_FAST_FLASH:
  450. change_mode = PWM_LED1_FAST_FLASH;
  451. break;
  452. case PWM_LED0_ONE_FLASH_5S:
  453. change_mode = PWM_LED1_ONE_FLASH_5S;
  454. break;
  455. case PWM_LED0_DOUBLE_FLASH_5S:
  456. change_mode = PWM_LED1_DOUBLE_FLASH_5S;
  457. break;
  458. case PWM_LED0_BREATHE:
  459. change_mode = PWM_LED1_BREATHE;
  460. break;
  461. case PWM_LED_ALL_ON:
  462. _pwm_led_display_mode(PWM_LED1_ON);
  463. led_pin_set_enable(__this->user_data->io_cfg.two_io.pin0);
  464. led_pin_set_enable(__this->user_data->io_cfg.two_io.pin1);
  465. if (__this->user_data->io_mode == LED_THREE_IO_MODE) {
  466. led_pin_set_enable(__this->user_data->io_cfg.three_io.pin2);
  467. }
  468. break;
  469. /////////////
  470. //双灯互闪
  471. case PWM_LED0_LED1_FAST_FLASH: //使用中断切灯
  472. isr_mode = PWM_LED1_FAST_FLASH;
  473. break;
  474. case PWM_LED0_LED1_SLOW_FLASH:
  475. isr_mode = PWM_LED1_SLOW_FLASH;
  476. break;
  477. //呼吸模式
  478. case PWM_LED0_LED1_BREATHE: //使用中断切灯
  479. isr_mode = PWM_LED1_BREATHE;
  480. break;
  481. #ifdef PWM_LED_THREE_IO_SUPPORT
  482. case PWM_LED2_ON:
  483. change_mode = PWM_LED1_ON;
  484. led2_enable = 1;
  485. break;
  486. case PWM_LED2_OFF:
  487. _pwm_led_display_mode(PWM_LED_ALL_OFF);
  488. led2_enable = 1;
  489. break;
  490. case PWM_LED2_SLOW_FLASH:
  491. change_mode = PWM_LED1_SLOW_FLASH;
  492. led2_enable = 1;
  493. break;
  494. case PWM_LED2_FAST_FLASH:
  495. change_mode = PWM_LED1_FAST_FLASH;
  496. led2_enable = 1;
  497. break;
  498. case PWM_LED2_DOUBLE_FLASH_5S:
  499. change_mode = PWM_LED1_DOUBLE_FLASH_5S;
  500. led2_enable = 1;
  501. break;
  502. case PWM_LED2_ONE_FLASH_5S:
  503. change_mode = PWM_LED1_ONE_FLASH_5S;
  504. led2_enable = 1;
  505. break;
  506. case PWM_LED0_LED2_FAST_FLASH:
  507. isr_mode = PWM_LED1_FAST_FLASH;
  508. __this->display_bit = 0b101;
  509. break;
  510. case PWM_LED1_LED2_FAST_FLASH:
  511. isr_mode = PWM_LED1_FAST_FLASH;
  512. __this->display_bit = 0b110;
  513. break;
  514. case PWM_LED0_LED2_SLOW_FLASH:
  515. isr_mode = PWM_LED1_SLOW_FLASH;
  516. __this->display_bit = 0b101;
  517. break;
  518. case PWM_LED1_LED2_SLOW_FLASH:
  519. __this->display_bit = 0b110;
  520. isr_mode = PWM_LED1_SLOW_FLASH;
  521. break;
  522. #endif /* #ifdef PWM_LED_THREE_IO_SUPPORT */
  523. default:
  524. break;
  525. }
  526. if (change_mode) {
  527. _pwm_led_display_mode(change_mode);
  528. LED_PWM_DISABLE;
  529. LED_BRI_DUTY1_SYNC0();
  530. if (led2_enable) {
  531. led_pin_set_enable(__this->user_data->io_cfg.three_io.pin2);
  532. } else {
  533. led_pin_set_enable(__this->user_data->io_cfg.two_io.pin0);
  534. }
  535. LED_PWM_ENABLE;
  536. }
  537. if (isr_mode) {
  538. _pwm_led_display_mode(isr_mode);
  539. if (display != PWM_LED0_LED1_BREATHE) {
  540. _led_pwm1_duty_set(0xFF, 2, 0, 0, 0); //占满整个周期
  541. }
  542. _pwm_led_register_irq(_change_io_display, 0);
  543. if (__this->display_bit == 0) {
  544. led_pin_set_enable(__this->user_data->io_cfg.two_io.pin1);
  545. } else {
  546. led_pin_set_enable(__this->user_data->io_cfg.three_io.pin2);
  547. }
  548. __this->display_index = 1;
  549. }
  550. #else /* #if (PWM_LED_TWO_IO_CONNECT == 0) */
  551. switch (display) {
  552. case PWM_LED_ALL_OFF:
  553. case PWM_LED0_OFF:
  554. case PWM_LED1_OFF:
  555. _pwm_led_display_mode(PWM_LED_ALL_OFF);
  556. break;
  557. case PWM_LED0_ON:
  558. case PWM_LED0_SLOW_FLASH:
  559. case PWM_LED0_FAST_FLASH:
  560. case PWM_LED0_ONE_FLASH_5S:
  561. case PWM_LED0_DOUBLE_FLASH_5S:
  562. case PWM_LED0_BREATHE:
  563. led_pin_set_enable(__this->user_data->io_cfg.two_io.pin0);
  564. _pwm_led_display_mode(display);
  565. break;
  566. case PWM_LED1_ON:
  567. change_mode = PWM_LED0_ON;
  568. break;
  569. case PWM_LED1_SLOW_FLASH:
  570. change_mode = PWM_LED0_SLOW_FLASH;
  571. break;
  572. case PWM_LED1_FAST_FLASH:
  573. change_mode = PWM_LED0_FAST_FLASH;
  574. break;
  575. case PWM_LED1_ONE_FLASH_5S:
  576. change_mode = PWM_LED0_ONE_FLASH_5S;
  577. break;
  578. case PWM_LED1_DOUBLE_FLASH_5S:
  579. change_mode = PWM_LED0_DOUBLE_FLASH_5S;
  580. break;
  581. case PWM_LED1_BREATHE:
  582. change_mode = PWM_LED0_BREATHE;
  583. break;
  584. case PWM_LED_ALL_ON:
  585. _pwm_led_display_mode(PWM_LED0_ON);
  586. led_pin_set_enable(__this->user_data->io_cfg.two_io.pin0);
  587. led_pin_set_enable(__this->user_data->io_cfg.two_io.pin1);
  588. break;
  589. /////////////
  590. //双灯互闪
  591. case PWM_LED0_LED1_FAST_FLASH: //使用中断切灯
  592. isr_mode = PWM_LED0_FAST_FLASH;
  593. break;
  594. case PWM_LED0_LED1_SLOW_FLASH:
  595. isr_mode = PWM_LED0_SLOW_FLASH;
  596. break;
  597. //呼吸模式
  598. case PWM_LED0_LED1_BREATHE: //使用中断切灯
  599. isr_mode = PWM_LED0_BREATHE;
  600. break;
  601. #ifdef PWM_LED_THREE_IO_SUPPORT
  602. case PWM_LED2_ON:
  603. change_mode = PWM_LED0_ON;
  604. led2_enable = 1;
  605. break;
  606. case PWM_LED2_OFF:
  607. _pwm_led_display_mode(PWM_LED_ALL_OFF);
  608. led2_enable = 1;
  609. break;
  610. case PWM_LED2_SLOW_FLASH:
  611. change_mode = PWM_LED0_SLOW_FLASH;
  612. led2_enable = 1;
  613. break;
  614. case PWM_LED2_FAST_FLASH:
  615. change_mode = PWM_LED0_FAST_FLASH;
  616. led2_enable = 1;
  617. break;
  618. case PWM_LED2_DOUBLE_FLASH_5S:
  619. change_mode = PWM_LED0_ONE_FLASH_5S;
  620. led2_enable = 1;
  621. break;
  622. case PWM_LED2_ONE_FLASH_5S:
  623. change_mode = PWM_LED0_ONE_FLASH_5S;
  624. led2_enable = 1;
  625. break;
  626. case PWM_LED0_LED2_FAST_FLASH:
  627. isr_mode = PWM_LED0_FAST_FLASH;
  628. __this->display_bit = 0b101;
  629. break;
  630. case PWM_LED1_LED2_FAST_FLASH:
  631. isr_mode = PWM_LED0_FAST_FLASH;
  632. __this->display_bit = 0b110;
  633. break;
  634. case PWM_LED0_LED2_SLOW_FLASH:
  635. isr_mode = PWM_LED0_SLOW_FLASH;
  636. __this->display_bit = 0b101;
  637. break;
  638. case PWM_LED1_LED2_SLOW_FLASH:
  639. isr_mode = PWM_LED0_SLOW_FLASH;
  640. __this->display_bit = 0b110;
  641. break;
  642. #endif /* #ifdef PWM_LED_THREE_IO_SUPPORT */
  643. default:
  644. break;
  645. }
  646. if (change_mode) {
  647. _pwm_led_display_mode(change_mode);
  648. LED_PWM_DISABLE;
  649. LED_BRI_DUTY0_SYNC1();
  650. if (led2_enable) {
  651. led_pin_set_enable(__this->user_data->io_cfg.three_io.pin2);
  652. } else {
  653. led_pin_set_enable(__this->user_data->io_cfg.two_io.pin1);
  654. }
  655. LED_PWM_ENABLE;
  656. }
  657. if (isr_mode) {
  658. _pwm_led_display_mode(isr_mode);
  659. if (display != PWM_LED0_LED1_BREATHE) {
  660. _led_pwm1_duty_set(0xFF, 2, 0, 0, 0); //占满整个周期
  661. }
  662. _pwm_led_register_irq(_change_io_display, 0);
  663. if (__this->display_bit == 0) {
  664. led_pin_set_enable(__this->user_data->io_cfg.two_io.pin1);
  665. } else {
  666. led_pin_set_enable(__this->user_data->io_cfg.three_io.pin2);
  667. }
  668. __this->display_index = 1;
  669. }
  670. #endif /* #if (PWM_LED_TWO_IO_CONNECT == 0) */
  671. }
  672. static void _pwm_led_two_io_user_define_mode(u8 led_index)
  673. {
  674. led_pwm_pre_set(); //led disable
  675. led_pin_set_disable(__this->user_data->io_cfg.two_io.pin0);
  676. led_pin_set_disable(__this->user_data->io_cfg.two_io.pin1);
  677. if (led_index == 0) {
  678. led_pin_set_enable(__this->user_data->io_cfg.two_io.pin0);
  679. } else if (led_index == 1) {
  680. led_pin_set_enable(__this->user_data->io_cfg.two_io.pin1);
  681. } else if (led_index == 2) {
  682. //双灯互闪切换
  683. __this->display_index = 0;
  684. led_pin_set_enable(__this->user_data->io_cfg.two_io.pin0);
  685. _pwm_led_register_irq(_change_io_display, 0);
  686. }
  687. }
  688. #else
  689. static void pwm_led_two_io_mode_display(u8 display)
  690. {
  691. return;
  692. }
  693. static void pwm_led_two_io_mode_slot_timer_display(u8 display)
  694. {
  695. return;
  696. }
  697. #endif /* #ifdef PWM_LED_TWO_IO_SUPPORT */
  698. static void pwm_led_one_io_mode_display(u8 display)
  699. {
  700. _pwm_led_display_mode(display);
  701. }
  702. /////////////////////////////
  703. /**
  704. * @brief: 设置led灯亮度
  705. * @param: bri_max, 最大亮度, 10bit, 0 ~ 1023
  706. * @param: bri_duty0, LED0亮度, 10bit, 0 ~ 1023
  707. * @param: bri_duty1, LED1亮度, 10bit, 0 ~ 1023
  708. *
  709. * @return void
  710. */
  711. static void _led_pwm_bright_set(u16 bri_max, u16 bri_duty0, u16 bri_duty1)
  712. {
  713. bri_max = bri_max >= 1024 ? 1023 : bri_max;
  714. bri_duty0 = bri_duty0 >= 1024 ? 1023 : bri_duty0;
  715. bri_duty1 = bri_duty1 >= 1024 ? 1023 : bri_duty1;
  716. bri_duty0 = bri_duty0 >= bri_max ? bri_max : bri_duty0;
  717. bri_duty1 = bri_duty1 >= bri_max ? bri_max : bri_duty1;
  718. LED_BRI_DUTY_CYCLE(bri_max);
  719. LED_BRI_DUTY0_SET(bri_duty0);
  720. LED_BRI_DUTY1_SET(bri_duty1);
  721. }
  722. void set_timer_pwm_duty(JL_TIMER_TypeDef *JL_TIMERx, u32 duty);
  723. void set_led_duty(u16 duty)
  724. {
  725. set_timer_pwm_duty(JL_TIMER0, duty);
  726. }
  727. /**
  728. * @brief: 设置PWM输出逻辑,
  729. * @param: pwm_inv_en, 最后pwm波形输出逻辑(默认是高电平灯亮),
  730. 0: 不取反, 高电平灯亮; 1: 取反, 低电平灯亮;
  731. * @param: shift_num
  732. 是否需要互闪,
  733. 0: 单闪; 1 ~ : 互闪;
  734. *
  735. * @return void
  736. */
  737. static void _led_pwm_output_logic_set(u8 pwm_inv_en, u8 shift_num)
  738. {
  739. if (pwm_inv_en) {
  740. LED_PWM_OUTPUT_INV_ENABLE;
  741. } else {
  742. LED_PWM_OUTPUT_INV_DISABLE;
  743. }
  744. LED_PWM_OUT_LOGIC_SET;
  745. LED_PWM_SHIFT_DUTY_SET(shift_num);
  746. }
  747. /**
  748. * @brief: 设置PWM1亮灭设置, 可以实现一个周期亮灭1次和2次,
  749. * @param: pwm_inv_en, 最后pwm波形输出逻辑(默认是高电平灯亮),
  750. 0: 不取反, 高电平灯亮; 1: 取反, 低电平灯亮;
  751. * @param: shift_num
  752. 是否需要互闪,
  753. 0: 单闪; 1 ~ : 互闪;
  754. *duty_cycle 固定为255或者设置PWM_DUTY3, 8bit
  755. * _duty1_ _duty3_
  756. * | | | |
  757. * | | | |
  758. *0__ __ duty0| | __ duty2| |__ __255/PWM_DUTY3
  759. * @return void
  760. */
  761. static void _led_pwm1_duty_set(u8 duty_prd, u8 duty0, u8 duty1, u8 duty2, u8 breathe)
  762. {
  763. if (duty_prd != 0xFF) {
  764. if (breathe == 0) {
  765. duty0 = duty0 > duty_prd ? duty_prd : duty0;
  766. duty1 = duty1 > duty_prd ? duty_prd : duty1;
  767. duty2 = duty2 > duty_prd ? duty_prd : duty2;
  768. LED_PWM1_PRD_SEL_EN;
  769. LED_PWM1_DUTY3_DIS;
  770. } else {
  771. LED_PWM1_PRD_SEL_DIS; //呼吸模式, duty0/1是亮灯延时, {duty3,duty2}是灭灯延时
  772. LED_PWM1_DUTY3_EN;
  773. }
  774. LED_PWM1_DUTY3_SET(duty_prd);
  775. } else {
  776. LED_PWM1_PRD_SEL_DIS;
  777. LED_PWM1_DUTY3_DIS;
  778. }
  779. if (duty0) {
  780. LED_PWM1_DUTY0_SET(duty0);
  781. LED_PWM1_DUTY0_EN;
  782. } else {
  783. LED_PWM1_DUTY0_DIS;
  784. }
  785. if (duty1) {
  786. LED_PWM1_DUTY1_SET(duty1);
  787. LED_PWM1_DUTY1_EN;
  788. } else {
  789. LED_PWM1_DUTY1_DIS;
  790. }
  791. if (duty2) {
  792. LED_PWM1_DUTY2_SET(duty2);
  793. LED_PWM1_DUTY2_EN;
  794. } else {
  795. LED_PWM1_DUTY2_DIS;
  796. }
  797. }
  798. /**
  799. * @brief:
  800. * @param: module_en = 0, breathe_en = 0, 关LED模块
  801. * @param: module_en = 0, breathe_en = 1, 关LED模块
  802. * @param: module_en = 1, breathe_en = 0, 开LED普通闪烁模式
  803. * @param: module_en = 1, breathe_en = 1, 开LED呼吸模式
  804. * @return void
  805. */
  806. static void _led_pwm_module_enable(u8 module_en, u8 breathe_en)
  807. {
  808. if (breathe_en) {
  809. LED_PWM_BREATHE_ENABLE;
  810. } else {
  811. LED_PWM_BREATHE_DISABLE;
  812. }
  813. if (module_en) {
  814. LED_PWM_ENABLE;
  815. } else {
  816. LED_PWM_DISABLE;
  817. }
  818. }
  819. /**
  820. * @brief: 设置pwm0时钟分频
  821. * clk0_div
  822. * pwm0_clk --------> pwm1_clk
  823. * @param: clk0_div, 12bit, 0 ~ 4095
  824. *
  825. * @return void
  826. */
  827. static void _led_pwm1_clk_set(u16 clk0_div)
  828. {
  829. clk0_div = clk0_div > 4096 ? 4096 : clk0_div;
  830. LED_PWM1_CLK_DIV(clk0_div);
  831. }
  832. /**
  833. * @brief: 关 led 配置, 亮度也设置为0
  834. *
  835. * @param led_index: 0: led0, 1:led1, 2:led0 & led1
  836. * @param led0_bright: 0 ~ 100
  837. * @param led1_bright: 0 ~ 100
  838. *
  839. * @return void
  840. */
  841. static void _pwm_led_off_display(void)
  842. {
  843. //TODO: set bright duty 0: avoid set on case
  844. led_pwm_pre_set(); //led disable
  845. _led_pwm_bright_set(0xFF, 0, 0);
  846. }
  847. /**
  848. * @brief: led 常亮显示设置
  849. * @param led_index: 0: led0, 1:led1, 2:led0 & led1
  850. * @param led0_bright, LED0亮度: 0 ~ 500
  851. * @param led1_bright, LED1亮度: 0 ~ 500
  852. *
  853. * @return void
  854. */
  855. static void _pwm_led_on_display(u8 led_index, u16 led0_bright, u16 led1_bright)
  856. {
  857. //step1: pwm0 clock
  858. if (__this->clock == PWM_LED_CLK_RC32K) {
  859. _led_pwm0_clk_set(PWM0_CLK_32K);
  860. } else {
  861. _led_pwm0_clk_set(PWM0_CLK_46K);
  862. }
  863. //step2: pwm1 clock
  864. _led_pwm1_clk_set(4);
  865. //bright set
  866. u8 shift_num = 0;
  867. u8 out_inv = 0;
  868. u16 led0_bri_duty = 0;
  869. u16 led1_bri_duty = 0;
  870. u16 led_bri_prd = 200;
  871. led0_bri_duty = led0_bright;
  872. led1_bri_duty = led1_bright;
  873. switch (led_index) {
  874. case 0:
  875. out_inv = 1;
  876. break;
  877. case 1:
  878. break;
  879. case 2:
  880. shift_num = 1;
  881. led_bri_prd = 160;
  882. break;
  883. default:
  884. led_debug("%s led index err", __func__);
  885. return;
  886. break;
  887. }
  888. led0_bri_duty = (led0_bri_duty * led_bri_prd) / 500;
  889. led1_bri_duty = (led1_bri_duty * led_bri_prd) / 500; //调试数据
  890. //step3: bright亮度
  891. _led_pwm_bright_set(led_bri_prd, led0_bri_duty, led1_bri_duty);
  892. //step4: 1.输出取反, 2.变色(互闪);
  893. _led_pwm_output_logic_set(out_inv, shift_num);
  894. //step5: 周期亮灭配置
  895. //pwm1 duty0, duty1, duty2
  896. _led_pwm1_duty_set(40, 2, 0, 0, 0);
  897. //step6: enable led module
  898. _led_pwm_module_enable(1, 0);
  899. }
  900. static void __pwm_led_flash_common_handle(u8 led_index, u16 led0_bright, u16 led1_bright, u32 period)
  901. {
  902. //step1: pwm0 clock
  903. u16 pwm0_prd = 500;
  904. u16 pwm0_div = 0;
  905. if (__this->clock == PWM_LED_CLK_RC32K) {
  906. _led_pwm0_clk_set(PWM0_CLK_32K);
  907. pwm0_div = (PWM0_RC_CLK32K_VALUE * period) / (1000 * 256);
  908. } else {
  909. if (period < 22000) {
  910. _led_pwm0_clk_set(PWM0_CLK_46K);
  911. pwm0_div = (PWM0_BT_CLK46K_VALUE * period) / (1000 * 256);
  912. } else {
  913. _led_pwm0_clk_set(PWM0_CLK_23K);
  914. pwm0_div = (PWM0_BT_CLK23K_VALUE * period) / (1000 * 256);
  915. pwm0_prd = 300;
  916. led0_bright = (led0_bright * 300) / 500;
  917. led1_bright = (led1_bright * 300) / 500;
  918. }
  919. }
  920. //step2: pwm1 clock
  921. _led_pwm1_clk_set(pwm0_div);
  922. //bright set
  923. u8 shift_num = 0;
  924. u8 out_inv = 0;
  925. u16 led0_bri_duty = 0;
  926. u16 led1_bri_duty = 0;
  927. switch (led_index) {
  928. case 0:
  929. led0_bri_duty = led0_bright;
  930. led1_bri_duty = 0;
  931. out_inv = 1;
  932. break;
  933. case 1:
  934. led0_bri_duty = 0;
  935. led1_bri_duty = led1_bright;
  936. break;
  937. case 2:
  938. shift_num = 1;
  939. led0_bri_duty = led0_bright;
  940. led1_bri_duty = led1_bright;
  941. break;
  942. default:
  943. led_debug("%s led index err", __func__);
  944. return;
  945. break;
  946. }
  947. //step3: bright亮度
  948. _led_pwm_bright_set(pwm0_prd, led0_bri_duty, led1_bri_duty);
  949. //step4: 1.输出取反, 2.变色(互闪);
  950. _led_pwm_output_logic_set(out_inv, shift_num);
  951. }
  952. /**
  953. * @brief: led 周期闪一次显示设置
  954. * @param led_index: 0: led0, 1:led1, 2:led0 & led1(互闪)
  955. led0_bright: led0亮度(0 ~ 500),
  956. led1_bright: led1亮度(0 ~ 500),
  957. period: 闪灯周期(ms), 多少ms闪一下(100 ~ 20000), 100ms - 20S,
  958. start_light_time: 在周期中开始亮灯的时间, -1: 周期最后亮灯, 默认填-1即可,
  959. light_time: 灯亮持续时间,
  960. *
  961. * @return void
  962. */
  963. static void _pwm_led_one_flash_display(u8 led_index, u16 led0_bright, u16 led1_bright,
  964. u32 period, u32 start_light_time, u32 light_time)
  965. {
  966. __pwm_led_flash_common_handle(led_index, led0_bright, led1_bright, period);
  967. //step5: 周期亮灭配置
  968. //pwm1 duty0, duty1, duty2
  969. u8 pwm1_duty0 = 0;
  970. u8 pwm1_duty1 = 0;
  971. if (start_light_time != -1) {
  972. if (start_light_time >= period) {
  973. led_err("start_light_time config err");
  974. _pwm_led_off_display(); //led off
  975. return;
  976. }
  977. //指定从哪个时间亮,
  978. pwm1_duty0 = (256 * start_light_time) / period;
  979. pwm1_duty0 = (pwm1_duty0) ? pwm1_duty0 : 2;
  980. if ((start_light_time + light_time) > period) {
  981. pwm1_duty1 = 0; //只开duty0
  982. } else {
  983. pwm1_duty1 = (256 * light_time) / period;
  984. pwm1_duty1 = (pwm1_duty1) ? pwm1_duty1 : 2;
  985. if ((pwm1_duty0 + pwm1_duty1) > 0xFF) {
  986. pwm1_duty1 = 0 ;
  987. } else {
  988. pwm1_duty1 += pwm1_duty0;
  989. }
  990. }
  991. } else {
  992. pwm1_duty0 = (256 * light_time) / period;
  993. pwm1_duty0 = (pwm1_duty0) ? pwm1_duty0 : 2;
  994. pwm1_duty0 = 256 - pwm1_duty0;
  995. }
  996. if ((led_index == 2) && (light_time == -1)) { //互闪, 占满整个周期
  997. pwm1_duty0 = 2;
  998. pwm1_duty1 = 0;
  999. }
  1000. _led_pwm1_duty_set(0xFF, pwm1_duty0, pwm1_duty1, 0, 0);
  1001. //step6: enable led module
  1002. _led_pwm_module_enable(1, 0);
  1003. }
  1004. /**
  1005. * @brief: led 周期闪一次显示设置
  1006. * @param led_index: 0: led0, 1:led1, 2:led0 & led1(互闪)
  1007. led0_bright: led0亮度,
  1008. led1_bright: led1亮度,
  1009. period: 闪灯周期(ms), 多少ms闪一下
  1010. first_light_time: 第一次亮灯持续时间,
  1011. second_light_time: 第二次亮灯持续时间,
  1012. gap_time: 两次亮灯时间间隔,
  1013. * @param led0_bright, LED0亮度: 0 ~ 500
  1014. * @param led1_bright, LED1亮度: 0 ~ 500
  1015. *
  1016. * @return void
  1017. */
  1018. static void _pwm_led_double_flash_display(u8 led_index, u16 led0_bright, u16 led1_bright,
  1019. u32 period, u32 first_light_time, u32 gap_time, u32 second_light_time)
  1020. {
  1021. __pwm_led_flash_common_handle(led_index, led0_bright, led1_bright, period);
  1022. //step5: 周期亮灭配置
  1023. //pwm1 duty0, duty1, duty2
  1024. u8 pwm1_duty0 = 0;
  1025. u8 pwm1_duty1 = 0;
  1026. u8 pwm1_duty2 = 0;
  1027. pwm1_duty2 = (256 * second_light_time) / period;
  1028. pwm1_duty2 = (pwm1_duty2) ? (0xFF - pwm1_duty2) : (0xFF - 2);
  1029. pwm1_duty1 = (256 * gap_time) / period;
  1030. pwm1_duty1 = (pwm1_duty1) ? (pwm1_duty2 - pwm1_duty1) : (pwm1_duty2 - 2);
  1031. pwm1_duty0 = (256 * first_light_time) / period;
  1032. pwm1_duty0 = (pwm1_duty0) ? (pwm1_duty1 - pwm1_duty0) : (pwm1_duty1 - 2);
  1033. _led_pwm1_duty_set(0xFF, pwm1_duty0, pwm1_duty1, pwm1_duty2, 0);
  1034. //step6: enable led module
  1035. _led_pwm_module_enable(1, 0);
  1036. }
  1037. /**
  1038. * @brief: led 周期呼吸显示,
  1039. * @param led_index: 0: led0, 1:led1, 2:led0 & led1(交互呼吸)
  1040. breathe_time: 呼吸周期(灭->最亮->灭), 设置范围: 500ms以上;
  1041. led0_bright: led0呼吸到最亮的亮度(0 ~ 500);
  1042. led1_bright: led1呼吸到最亮的亮度(0 ~ 500);
  1043. led0_light_delay_time: led0最高亮度延时(0 ~ 100ms);
  1044. led1_light_delay_time: led1最高亮度延时(0 ~ 100ms);
  1045. led_blink_delay_time: led0和led1灭灯延时(0 ~ 20000ms), 0 ~ 20S;
  1046. *
  1047. * @return void
  1048. */
  1049. static void _pwm_led_breathe_display(u8 led_index, u16 breathe_time, u16 led0_bright, u16 led1_bright,
  1050. u32 led0_light_delay_time, u32 led1_light_delay_time, u32 led_blink_delay_time)
  1051. {
  1052. u16 led0_bri_duty = led0_bright;
  1053. u16 led1_bri_duty = led1_bright;
  1054. u16 pwm1_div = 0;
  1055. u16 Tpwm1 = 0;
  1056. pwm1_div = led0_bri_duty > led1_bri_duty ? led0_bri_duty : led1_bri_duty;
  1057. breathe_time = breathe_time / 2; //呼吸总时间, 单个灭到最亮的时间
  1058. //step1: pwm0 clock
  1059. if (__this->clock == PWM_LED_CLK_RC32K) {
  1060. _led_pwm0_clk_set(PWM0_CLK_32K);
  1061. pwm1_div = breathe_time * 32 / pwm1_div;
  1062. Tpwm1 = (pwm1_div * 1000 / 32000); //ms
  1063. } else {
  1064. _led_pwm0_clk_set(PWM0_CLK_46K);
  1065. pwm1_div = breathe_time * 46 / pwm1_div;
  1066. Tpwm1 = (pwm1_div * 1000 / 46000); //ms
  1067. }
  1068. //step2: pwm1 clock
  1069. _led_pwm1_clk_set(pwm1_div);
  1070. //bright set
  1071. u8 shift_num = 0;
  1072. u8 out_inv = 0;
  1073. switch (led_index) {
  1074. case 0:
  1075. led1_bri_duty = 0;
  1076. out_inv = 1;
  1077. break;
  1078. case 1:
  1079. led0_bri_duty = 0;
  1080. break;
  1081. case 2:
  1082. shift_num = 2;
  1083. break;
  1084. default:
  1085. led_debug("%s led index err", __func__);
  1086. return;
  1087. }
  1088. //step3: bright亮度
  1089. _led_pwm_bright_set(500, led0_bri_duty, led1_bri_duty);
  1090. //step4: 1.输出取反, 2.变色(互闪);
  1091. _led_pwm_output_logic_set(out_inv, shift_num);
  1092. //step5: 周期亮灭配置
  1093. //pwm1 duty0, duty1, duty2
  1094. u8 pwm1_duty0 = 0;
  1095. u8 pwm1_duty1 = 0;
  1096. u8 pwm1_duty2 = 0;
  1097. u8 pwm1_duty3 = 0xFF;
  1098. if (Tpwm1 == 0) {
  1099. led0_light_delay_time *= 2;
  1100. led1_light_delay_time *= 2;
  1101. led_blink_delay_time *= 2;
  1102. Tpwm1 = 1;
  1103. }
  1104. //最高亮度延时
  1105. pwm1_duty0 = led0_light_delay_time / Tpwm1;
  1106. pwm1_duty1 = led1_light_delay_time / Tpwm1;
  1107. //灭灯延时,{duty3, duty2}, 16bit
  1108. pwm1_duty2 = (led_blink_delay_time / Tpwm1) & 0xFF;
  1109. pwm1_duty3 = ((led_blink_delay_time / Tpwm1) >> 8) & 0xFF;
  1110. _led_pwm1_duty_set(pwm1_duty3, pwm1_duty0, pwm1_duty1, pwm1_duty2, 1);
  1111. //step6: enable led module
  1112. _led_pwm_module_enable(1, 1);
  1113. }
  1114. static void _pwm_led_display_mode(u8 display)
  1115. {
  1116. led_pwm_pre_set();
  1117. switch (display) {
  1118. case PWM_LED_ALL_OFF:
  1119. case PWM_LED0_OFF:
  1120. case PWM_LED1_OFF:
  1121. _pwm_led_off_display();
  1122. break;
  1123. //灯常亮
  1124. case PWM_LED0_ON:
  1125. _pwm_led_on_display(0, CFG_LED0_LIGHT, CFG_LED1_LIGHT);
  1126. break;
  1127. case PWM_LED1_ON:
  1128. _pwm_led_on_display(1, CFG_LED0_LIGHT, CFG_LED1_LIGHT);
  1129. break;
  1130. case PWM_LED_ALL_ON:
  1131. _pwm_led_on_display(2, CFG_LED0_LIGHT, CFG_LED1_LIGHT);
  1132. break;
  1133. //单灯单闪
  1134. case PWM_LED0_SLOW_FLASH:
  1135. _pwm_led_one_flash_display(0, CFG_LED0_LIGHT, CFG_LED1_LIGHT, CFG_SINGLE_SLOW_FLASH_FREQ, -1, CFG_SINGLE_SLOW_LIGHT_TIME);
  1136. break;
  1137. case PWM_LED1_SLOW_FLASH:
  1138. _pwm_led_one_flash_display(1, CFG_LED0_LIGHT, CFG_LED1_LIGHT, CFG_SINGLE_SLOW_FLASH_FREQ, -1, CFG_SINGLE_SLOW_LIGHT_TIME);
  1139. break;
  1140. case PWM_LED0_FAST_FLASH:
  1141. _pwm_led_one_flash_display(0, CFG_LED0_LIGHT, CFG_LED1_LIGHT, CFG_SINGLE_FAST_FLASH_FREQ, -1, CFG_SINGLE_FAST_LIGHT_TIME);
  1142. break;
  1143. case PWM_LED1_FAST_FLASH:
  1144. _pwm_led_one_flash_display(1, CFG_LED0_LIGHT, CFG_LED1_LIGHT, CFG_SINGLE_FAST_FLASH_FREQ, -1, CFG_SINGLE_FAST_LIGHT_TIME);
  1145. break;
  1146. case PWM_LED0_ONE_FLASH_5S:
  1147. _pwm_led_one_flash_display(0, CFG_LED0_LIGHT, CFG_LED1_LIGHT, 5000, 10, CFG_LED_5S_FLASH_LIGHT_TIME);
  1148. break;
  1149. case PWM_LED1_ONE_FLASH_5S:
  1150. _pwm_led_one_flash_display(1, CFG_LED0_LIGHT, CFG_LED1_LIGHT, 5000, 10, CFG_LED_5S_FLASH_LIGHT_TIME);
  1151. break;
  1152. //单灯双闪
  1153. case PWM_LED0_DOUBLE_FLASH_5S:
  1154. _pwm_led_double_flash_display(0, CFG_LED0_LIGHT, CFG_LED1_LIGHT, 5000, 100, 200, 100);
  1155. break;
  1156. case PWM_LED1_DOUBLE_FLASH_5S:
  1157. _pwm_led_double_flash_display(1, CFG_LED0_LIGHT, CFG_LED1_LIGHT, 5000, 100, 200, 100);
  1158. break;
  1159. //双灯互闪
  1160. case PWM_LED0_LED1_FAST_FLASH:
  1161. _pwm_led_one_flash_display(2, CFG_LED0_LIGHT, CFG_LED1_LIGHT, CFG_DOUBLE_FAST_FLASH_FREQ, -1, -1);
  1162. break;
  1163. case PWM_LED0_LED1_SLOW_FLASH:
  1164. _pwm_led_one_flash_display(2, CFG_LED0_LIGHT, CFG_LED1_LIGHT, CFG_DOUBLE_SLOW_FLASH_FREQ, -1, -1);
  1165. break;
  1166. //呼吸模式
  1167. case PWM_LED0_BREATHE:
  1168. _pwm_led_breathe_display(0, CFG_LED_BREATH_TIME, CFG_LED0_BREATH_BRIGHT, CFG_LED1_BREATH_BRIGHT, 0, 0, CFG_LED_BREATH_BLINK_TIME);
  1169. break;
  1170. case PWM_LED1_BREATHE:
  1171. _pwm_led_breathe_display(1, CFG_LED_BREATH_TIME, CFG_LED0_BREATH_BRIGHT, CFG_LED1_BREATH_BRIGHT, 0, 0, CFG_LED_BREATH_BLINK_TIME);
  1172. break;
  1173. case PWM_LED0_LED1_BREATHE:
  1174. _pwm_led_breathe_display(2, CFG_LED_BREATH_TIME, CFG_LED0_BREATH_BRIGHT, CFG_LED1_BREATH_BRIGHT, 0, 0, CFG_LED_BREATH_BLINK_TIME);
  1175. break;
  1176. }
  1177. }
  1178. static void _pwm_led_user_define_mode_handle(u8 dis_mode)
  1179. {
  1180. return;
  1181. }
  1182. //=================================================================================//
  1183. // 以下为 LED API //
  1184. //=================================================================================//
  1185. //=================================================================================//
  1186. //@brief: LED模式显示模式设置
  1187. //@input: display, 显示模式
  1188. //@return: void
  1189. //@note:
  1190. //=================================================================================//
  1191. void pwm_led_mode_set(u8 display)
  1192. {
  1193. if (__this->init == 0) {
  1194. led_debug("led no init");
  1195. return;
  1196. }
  1197. r_printf("Mode %d Display", display);
  1198. if (display == PWM_LED_NULL) {
  1199. return;
  1200. }
  1201. if (((display >= PWM_LED_USER_DEFINE_BEGIN) && (display <= PWM_LED_USER_DEFINE_END))) {
  1202. //用户自定义模式
  1203. if (display != __this->last_mode) {
  1204. _pwm_led_user_define_mode_handle(display);
  1205. }
  1206. return;
  1207. }
  1208. if ((display >= _PWM_LED_MODE_END_) || (display == PWM_LED_MODE_END) || (display == PWM_LED0_FLASH_THREE) || (display == PWM_LED1_FLASH_THREE)/*|| (display == __this->last_mode)*/) {
  1209. return;
  1210. }
  1211. if ((display == PWM_LED_ALL_OFF) || (display == PWM_LED0_OFF) || (display == PWM_LED1_OFF)) {
  1212. led_pwm_pre_set(); //关LED
  1213. __this->last_mode = display;
  1214. return;
  1215. }
  1216. _pwm_led_close_irq();
  1217. if ((__this->user_data->io_mode == LED_TWO_IO_MODE) || (__this->user_data->io_mode == LED_THREE_IO_MODE)) {
  1218. pwm_led_two_io_mode_display(display);
  1219. } else {
  1220. pwm_led_one_io_mode_display(display);
  1221. }
  1222. __this->last_mode = display;
  1223. log_pwm_led_info();
  1224. }
  1225. //=================================================================================//
  1226. //@brief: LED模块时钟源选择
  1227. //@input: src, 时钟源BT24M/RC32K
  1228. //@return: void
  1229. //@note:
  1230. //=================================================================================//
  1231. void pwm_led_clk_set(enum pwm_led_clk_source src)
  1232. {
  1233. u8 mode_bak;
  1234. if (__this->init == 0) {
  1235. return;
  1236. }
  1237. led_debug("%s: src = %d", __func__, src);
  1238. _pwm_led_close_irq();
  1239. if (src == __this->clock) {
  1240. return;
  1241. }
  1242. if (src != PWM_LED_CLK_RC32K && src != PWM_LED_CLK_BTOSC_24M) {
  1243. return;
  1244. }
  1245. mode_bak = __this->last_mode;
  1246. pwm_led_mode_set(PWM_LED_ALL_OFF);
  1247. pwm_clock_set(src);
  1248. pwm_led_mode_set(mode_bak);
  1249. }
  1250. //=================================================================================//
  1251. //@brief: LED显示周期复位, 重新开始一个周期, 可用于同步等操作
  1252. //@input: void
  1253. //@return: void
  1254. //@note:
  1255. //=================================================================================//
  1256. void pwm_led_display_mode_reset(void)
  1257. {
  1258. /* u8 last_mode; */
  1259. /* last_mode = __this->last_mode; */
  1260. if (__this->init == 0) {
  1261. return;
  1262. }
  1263. LED_PWM_DISABLE;
  1264. LED_PWM_ENABLE;
  1265. }
  1266. //=================================================================================//
  1267. //@brief: 获取LED当前显示模式
  1268. //@input: void
  1269. //@return: 当前LED显示模式
  1270. //@note:
  1271. //=================================================================================//
  1272. enum pwm_led_mode pwm_led_display_mode_get(void)
  1273. {
  1274. return __this->last_mode;
  1275. }
  1276. //=================================================================================//
  1277. //@brief: 修改LED灯IO口驱动能力,
  1278. //@input: void
  1279. //@return: 当前LED显示模式
  1280. //@note:
  1281. //挡位: 0 ~ 3
  1282. // 0: 2.4mA(8mA mos + 120Ωres)
  1283. // 1: 8mA(8mA mos)
  1284. // 2: 18.4mA(24mA mos + 120Ωres)
  1285. // 3: 24mA(24mA mos)
  1286. //=================================================================================//
  1287. void pwm_led_io_max_drive_set(u8 strength)
  1288. {
  1289. LED_PWM_IO_MAX_DRIVE(strength);
  1290. }
  1291. //=================================================================================//
  1292. //@brief: 获取LED模块是否开启, 可用于sniff灯同步
  1293. //@input: void
  1294. //@return: 0: 模块开启; 1: 模块关闭
  1295. //@note:
  1296. //=================================================================================//
  1297. u8 is_pwm_led_on(void)
  1298. {
  1299. if (__this->init == 0) {
  1300. return 0;
  1301. }
  1302. return IS_PWM_LED_ON;
  1303. }
  1304. bool is_led_module_on()
  1305. {
  1306. if (__this->init == 0) {
  1307. return 0;
  1308. }
  1309. return IS_PWM_LED_ON;
  1310. }
  1311. //=================================================================================//
  1312. //@brief: 获取LED模块开启, 可用于sniff灯同步
  1313. //@input: void
  1314. //@return: void
  1315. //@note:
  1316. //=================================================================================//
  1317. void pwm_led_set_on(void)
  1318. {
  1319. if (__this->init == 0) {
  1320. return;
  1321. }
  1322. LED_PWM_ENABLE;
  1323. }
  1324. void led_module_on()
  1325. {
  1326. led_debug("module_on");
  1327. if (__this->init == 0) {
  1328. return;
  1329. }
  1330. LED_PWM_ENABLE;
  1331. }
  1332. //=================================================================================//
  1333. //@brief: 获取LED模块关闭, 可用于sniff灯同步
  1334. //@input: void
  1335. //@return: void
  1336. //@note:
  1337. //=================================================================================//
  1338. void pwm_led_set_off(void)
  1339. {
  1340. if (__this->init == 0) {
  1341. return;
  1342. }
  1343. LED_PWM_DISABLE;
  1344. }
  1345. void led_module_off()
  1346. {
  1347. led_debug("module_off");
  1348. if (__this->init == 0) {
  1349. return;
  1350. }
  1351. LED_PWM_DISABLE;
  1352. }
  1353. //=================================================================================//
  1354. //@brief: 自定义设置单灯闪状态
  1355. //@input: void
  1356. // led_index: 0: led0, 1:led1, 2:led0 & led1(互闪)
  1357. // led0_bright: led0亮度(0 ~ 500),
  1358. // led1_bright: led1亮度(0 ~ 500),
  1359. // period: 闪灯周期(ms), 多少ms闪一下,
  1360. // start_light_time: 在周期中开始亮灯的时间, -1: 周期最后亮灯, 默认填-1即可,
  1361. // light_time: 灯亮持续时间(ms),
  1362. //@return: void
  1363. //@note:
  1364. //=================================================================================//
  1365. void pwm_led_one_flash_display(u8 led_index, u16 led0_bright, u16 led1_bright,
  1366. u32 period, u32 start_light_time, u32 light_time)
  1367. {
  1368. _pwm_led_close_irq();
  1369. //两个IO特殊处理
  1370. if (__this->user_data->io_mode == LED_TWO_IO_MODE) {
  1371. #ifdef PWM_LED_TWO_IO_SUPPORT
  1372. _pwm_led_two_io_user_define_mode(led_index);
  1373. if (led_index == 0) {
  1374. led_index = 1;
  1375. led1_bright = led0_bright;
  1376. }
  1377. #endif /* #ifdef PWM_LED_TWO_IO_SUPPORT */
  1378. }
  1379. _pwm_led_one_flash_display(led_index, led0_bright, led1_bright,
  1380. period, start_light_time, light_time);
  1381. __this->last_mode = PWM_LED_USER_DEFINE_MODE;
  1382. }
  1383. //=================================================================================//
  1384. //@brief: 自定义设置单灯双闪状态
  1385. //@input:
  1386. // led_index: 0: led0, 1:led1, 2:led0 & led1(互闪)
  1387. // led0_bright: led0亮度,
  1388. // led1_bright: led1亮度,
  1389. // period: 闪灯周期(ms), 多少ms闪一下
  1390. // first_light_time: 第一次亮灯持续时间,
  1391. // second_light_time: 第二次亮灯持续时间,
  1392. // gap_time: 两次亮灯时间间隔,
  1393. // led0_bright, LED0亮度: 0 ~ 500
  1394. // led1_bright, LED1亮度: 0 ~ 500
  1395. //@return: void
  1396. //@note:
  1397. //=================================================================================//
  1398. void pwm_led_double_flash_display(u8 led_index, u16 led0_bright, u16 led1_bright,
  1399. u32 period, u32 first_light_time, u32 gap_time, u32 second_light_time)
  1400. {
  1401. _pwm_led_close_irq();
  1402. //两个IO特殊处理
  1403. if (__this->user_data->io_mode == LED_TWO_IO_MODE) {
  1404. #ifdef PWM_LED_TWO_IO_SUPPORT
  1405. _pwm_led_two_io_user_define_mode(led_index);
  1406. if (led_index == 0) {
  1407. led_index = 1;
  1408. led1_bright = led0_bright;
  1409. }
  1410. led_index = 0;
  1411. #endif /* #ifdef PWM_LED_TWO_IO_SUPPORT */
  1412. }
  1413. _pwm_led_double_flash_display(led_index, led0_bright, led1_bright,
  1414. period, first_light_time, gap_time, second_light_time);
  1415. __this->last_mode = PWM_LED_USER_DEFINE_MODE;
  1416. }
  1417. //=================================================================================//
  1418. //@brief: 自定义设置呼吸模式
  1419. //@input:
  1420. // led_index: 0: led0, 1:led1, 2:led0 & led1(互闪)
  1421. // led0_bright: led0亮度,
  1422. // led1_bright: led1亮度,
  1423. // period: 闪灯周期(ms), 多少ms闪一下,
  1424. // start_light_time: 在周期中开始亮灯的时间, -1: 周期最后亮灯
  1425. // light_time: 灯亮持续时间,
  1426. // led0_bright, LED0亮度: 0 ~ 500
  1427. // led1_bright, LED1亮度: 0 ~ 500
  1428. //@return: void
  1429. //@note:
  1430. //=================================================================================//
  1431. void pwm_led_breathe_display(u8 led_index, u16 breathe_time, u16 led0_bright, u16 led1_bright,
  1432. u32 led0_light_delay_time, u32 led1_light_delay_time, u32 led_blink_delay_time)
  1433. {
  1434. _pwm_led_close_irq();
  1435. if (__this->user_data->io_mode == LED_TWO_IO_MODE) {
  1436. #ifdef PWM_LED_TWO_IO_SUPPORT
  1437. _pwm_led_two_io_user_define_mode(led_index);
  1438. if (led_index == 0) {
  1439. led_index = 1;
  1440. led1_bright = led0_bright;
  1441. }
  1442. #endif /* #ifdef PWM_LED_TWO_IO_SUPPORT */
  1443. }
  1444. _pwm_led_breathe_display(led_index, breathe_time, led0_bright, led1_bright,
  1445. led0_light_delay_time, led1_light_delay_time, led_blink_delay_time);
  1446. __this->last_mode = PWM_LED_USER_DEFINE_MODE;
  1447. }
  1448. //=================================================================================//
  1449. //@brief: 注册LED周期中断函数, 每个LED周期结束后会调用一次, 可以统计指定状态闪烁多少次
  1450. //@input:
  1451. //@return: void
  1452. //@note:
  1453. //=================================================================================//
  1454. void pwm_led_register_irq(void (*func)(void))
  1455. {
  1456. _pwm_led_register_irq(func, 1);
  1457. }
  1458. #ifdef PWM_LED_TEST_MODE
  1459. void pwm_led_mode_test()
  1460. {
  1461. //pwm_led_mode_set(PWM_LED0_SLOW_FLASH);
  1462. //pwm_led_mode_set(PWM_LED0_ON);
  1463. //pwm_led_mode_set(PWM_LED0_LED1_FAST_FLASH);
  1464. //pwm_led_mode_set(PWM_LED0_LED1_BREATHE);
  1465. pwm_led_mode_set(PWM_LED0_BREATHE);
  1466. }
  1467. static void _pwm_led_test_isr(void)
  1468. {
  1469. //led_debug("%s", __func__);
  1470. led_putchar('B');
  1471. }
  1472. void pwm_led_test()
  1473. {
  1474. static const char *dis_mode[] = {
  1475. "ALL off",
  1476. "ALL on",
  1477. "BLUE on",
  1478. "BLUE off",
  1479. "BLUE slow flash",
  1480. "BLUE fast flash",
  1481. "BLUE double flash 5s",
  1482. "BLUE one flash 5s",
  1483. "RED on",
  1484. "RED off",
  1485. "RED slow flash",
  1486. "RED fast flash",
  1487. "RED double flash 5s",
  1488. "RED one flash 5s",
  1489. "RED & BLUE fast falsh",
  1490. "RED & BLUE slow",
  1491. "BLUE breathe",
  1492. "RED breathe",
  1493. "RED & BLUE breathe",
  1494. #ifdef PWM_LED_THREE_IO_SUPPORT
  1495. "res",
  1496. "res",
  1497. "res",
  1498. "LED2 on",
  1499. "LED2 off",
  1500. "LED2 slow flash",
  1501. "LED2 fast flash",
  1502. "LED2 double flash 5s",
  1503. "LED2 one flash 5s",
  1504. "0 & 2 fast falsh",
  1505. "1 & 2 fast falsh",
  1506. "0 & 2 slow falsh",
  1507. "1 & 2 slow falsh",
  1508. #endif /* #ifdef PWM_LED_THREE_IO_SUPPORT */
  1509. };
  1510. /* static u8 index = C_BLED_BREATHE; */
  1511. /* static u8 index = PWM_LED_ALL_OFF; */
  1512. //static u8 index = PWM_LED0_LED1_BREATHE;
  1513. static u8 index = PWM_LED_ALL_ON;
  1514. /* static u8 index = PWM_LED1_ON; */
  1515. /* static u8 index = PWM_LED2_ON; */
  1516. printf("\n\nDISPLAY MODE : %d-%s", index, dis_mode[index - 1]);
  1517. led_debug("\n\nDISPPLAY MODE : %d-%s", index, dis_mode[index - 1]);
  1518. pwm_led_mode_set(index++);
  1519. pwm_led_register_irq(_pwm_led_test_isr);
  1520. if (index >= PWM_LED_MODE_END) {
  1521. index = PWM_LED_ALL_OFF;
  1522. }
  1523. }
  1524. void pwm_two_io_test()
  1525. {
  1526. #define TEST_STATUS1 PWM_LED_ALL_ON
  1527. #define TEST_STATUS2 PWM_LED0_LED1_SLOW_FLASH
  1528. static u8 index = TEST_STATUS1;
  1529. pwm_led_mode_set(index);
  1530. /* if (index == TEST_STATUS1) { */
  1531. /* index = TEST_STATUS2; */
  1532. /* } else { */
  1533. /* index = TEST_STATUS1; */
  1534. /* } */
  1535. }
  1536. //====== Test pwm led singal to ALL IO
  1537. struct io_group_test {
  1538. u8 start;
  1539. u8 end;
  1540. };
  1541. static const struct io_group_test led_io_group[] = {
  1542. {IO_PORTA_00, IO_PORTA_08}, //PA0 ~ PA8
  1543. {IO_PORTB_00, IO_PORTB_08}, //PB0 ~ PB8
  1544. //{IO_PORTC_00, IO_PORTC_05}, //PC0 ~ PC5
  1545. };
  1546. void led_io_group_test(void)
  1547. {
  1548. u8 i, j;
  1549. for (i = 0; i < ARRAY_SIZE(led_io_group); i++) {
  1550. for (j = led_io_group[i].start; j < led_io_group[i].end + 1; j++) {
  1551. led_pin_set_enable(j);
  1552. }
  1553. }
  1554. led_pin_set_enable(IO_PORT_DM);
  1555. led_pin_set_enable(IO_PORT_DP);
  1556. }
  1557. #endif /* #ifdef PWM_LED_TEST_MODE */