18
18
#define PWM_CONTROLLER_NUM_MAX 4
19
19
#define PWM_CHANNEL_NUM_MAX 8
20
20
21
- #define PWM_WAVE_8BIT_TEST 1
21
+ #define PWM_WAVE_BREATHING_LIGHT_8BIT_TEST 1
22
22
23
23
/* 400k pwm_dclk src */
24
- #ifdef PWM_WAVE_8BIT_TEST
24
+ #ifndef PWM_WAVE_PRIOD_DUTY_BOTH_UPDATE_TEST
25
+ #ifdef PWM_WAVE_BREATHING_LIGHT_8BIT_TEST
25
26
#define PWM_TABLE_MAX 256
26
27
#define PWM_WIDTH_MODE PWM_WAVE_TABLE_8BITS_WIDTH
27
28
/* in nanoseconds */
34
35
#define PWM_WAVE_STEP 10000
35
36
#define PWM_WAVE_RPT 10
36
37
#endif
38
+ #endif
37
39
38
40
struct pwm_test_data {
39
41
struct pwm_device * pwm_dev ;
@@ -156,8 +158,12 @@ static void pwm_rockchip_test_help_info(void)
156
158
pr_info ("\n" );
157
159
pr_info ("wave generator demo:\n" );
158
160
pr_info ("echo wave 0 1 true > /dev/pwm_rockchip_misc_test\n" );
161
+ pr_info ("[brathing light demo with 8bit table]\n" );
159
162
pr_info ("echo continuous 0 1 640000 320000 normal > /dev/pwm_rockchip_misc_test\n" );
163
+ pr_info ("[brathing light demo with 16bit table]\n" );
160
164
pr_info ("echo continuous 0 1 1000000 500000 normal > /dev/pwm_rockchip_misc_test\n" );
165
+ pr_info ("[demo for updating both period and duty]\n" );
166
+ pr_info ("echo continuous 0 1 1000 500 normal > /dev/pwm_rockchip_misc_test\n" );
161
167
pr_info ("echo enable 0 1 true > /dev/pwm_rockchip_misc_test\n" );
162
168
pr_info ("------------------------------------------------------------------------------------\n" );
163
169
}
@@ -200,7 +206,7 @@ static ssize_t pwm_rockchip_test_write(struct file *file, const char __user *buf
200
206
struct pwm_device * pdev ;
201
207
struct pwm_state state ;
202
208
struct pwm_capture cap_res ;
203
- struct rockchip_pwm_wave_table duty_table ;
209
+ struct rockchip_pwm_wave_table wave_table ;
204
210
struct rockchip_pwm_wave_config wave_config ;
205
211
struct rockchip_pwm_biphasic_config biphasic_config ;
206
212
enum rockchip_pwm_freq_meter_input_sel freq_input_sel ;
@@ -627,14 +633,59 @@ static ssize_t pwm_rockchip_test_write(struct file *file, const char __user *buf
627
633
goto exit ;
628
634
}
629
635
636
+ #ifdef PWM_WAVE_PRIOD_DUTY_BOTH_UPDATE_TEST
637
+ /*
638
+ * The output wave should be like:
639
+ * _ _ _ _ _
640
+ * | | | | | | | | | |
641
+ * __| |_| |_| |_| |_| |_____________________________________
642
+ *
643
+ * | | |
644
+ * | five 400K waves | delay 10ms |
645
+ * | | |
646
+ */
647
+ table [0 ] = 2500 ;
648
+ table [1 ] = 500000 ; // avoid exceeding the 16-bit table
649
+ table [2 ] = 500000 ;
650
+ table [3 ] = 500000 ;
651
+ table [4 ] = 500000 ;
652
+ table [5 ] = 1250 ;
653
+ table [6 ] = 0 ;
654
+ table [7 ] = 0 ;
655
+ table [8 ] = 0 ;
656
+ table [9 ] = 0 ;
657
+
658
+ wave_table .table = table ;
659
+ wave_table .offset = 0 ;
660
+ wave_table .len = 10 ;
661
+
662
+ wave_config .wave_table = & wave_table ;
663
+ wave_config .clk_src = PWM_SELECT_CLK_PWM ;
664
+ wave_config .mem_clk_src = PWM_SELECT_CLK_PWM_OSC ;
665
+ wave_config .width_mode = PWM_WAVE_TABLE_16BITS_WIDTH ;
666
+ wave_config .update_mode = PWM_WAVE_INCREASING ;
667
+ wave_config .enable = enable ;
668
+ wave_config .duty_en = true;
669
+ wave_config .period_en = true;
670
+ wave_config .clk_rate = 100000000 ;
671
+ wave_config .rpt = 4 ;
672
+ wave_config .duty_max = 9 ;
673
+ wave_config .duty_min = 5 ;
674
+ wave_config .period_max = 4 ;
675
+ wave_config .period_min = 0 ;
676
+ wave_config .offset = 0 ;
677
+ wave_config .middle = 0 ;
678
+ wave_config .max_hold = 0 ;
679
+ wave_config .min_hold = 0 ;
680
+ wave_config .middle_hold = 0 ;
681
+ #else
630
682
for (i = 0 ; i < PWM_TABLE_MAX ; i ++ )
631
683
table [i ] = i * PWM_WAVE_STEP ;
632
- duty_table .table = table ;
633
- duty_table .offset = (channel_id % 3 ) * PWM_TABLE_MAX ;
634
- duty_table .len = PWM_TABLE_MAX ;
684
+ wave_table .table = table ;
685
+ wave_table .offset = (channel_id % 3 ) * PWM_TABLE_MAX ;
686
+ wave_table .len = PWM_TABLE_MAX ;
635
687
636
- wave_config .duty_table = & duty_table ;
637
- wave_config .period_table = NULL ;
688
+ wave_config .wave_table = & wave_table ;
638
689
wave_config .clk_src = PWM_SELECT_CLK_PWM ;
639
690
wave_config .mem_clk_src = PWM_SELECT_CLK_PWM_OSC ;
640
691
wave_config .width_mode = PWM_WIDTH_MODE ;
@@ -653,6 +704,7 @@ static ssize_t pwm_rockchip_test_write(struct file *file, const char __user *buf
653
704
wave_config .max_hold = 3 ;
654
705
wave_config .min_hold = 0 ;
655
706
wave_config .middle_hold = 2 ;
707
+ #endif
656
708
657
709
ret = rockchip_pwm_set_wave (pdev , & wave_config );
658
710
if (ret ) {
@@ -662,8 +714,10 @@ static ssize_t pwm_rockchip_test_write(struct file *file, const char __user *buf
662
714
goto exit ;
663
715
}
664
716
717
+ #ifndef PWM_WAVE_PRIOD_DUTY_BOTH_UPDATE_TEST
665
718
pr_info ("%s %s mode for pwm%d_%d: table_len = %d, table_step = %d\n" ,
666
719
argv [2 ], cmd , controller_id , channel_id , PWM_TABLE_MAX , PWM_WAVE_STEP );
720
+ #endif
667
721
break ;
668
722
case PWM_GLOBAL_CTRL :
669
723
if (!argv [0 ]) {
0 commit comments