pwm: rockchip-test: Add demo for updating both period and duty in wave generator mode

The demo wave should be like:

    _   _   _   _   _
   | | | | | | | | | |
 __| |_| |_| |_| |_| |_____________________________________

 |                   |                                    |
 |  five 400K waves  |             delay 10ms             |
 |                   |                                    |

Change-Id: I89c1d921dd2b230debe2664036b20c1d305cd35f
Signed-off-by: Damon Ding <damon.ding@rock-chips.com>
This commit is contained in:
Damon Ding
2025-04-27 17:05:10 +08:00
committed by Tao Huang
parent 31546c56cb
commit 559aa0ed87

View File

@@ -18,10 +18,11 @@
#define PWM_CONTROLLER_NUM_MAX 4
#define PWM_CHANNEL_NUM_MAX 8
#define PWM_WAVE_8BIT_TEST 1
#define PWM_WAVE_BREATHING_LIGHT_8BIT_TEST 1
/* 400k pwm_dclk src */
#ifdef PWM_WAVE_8BIT_TEST
#ifndef PWM_WAVE_PRIOD_DUTY_BOTH_UPDATE_TEST
#ifdef PWM_WAVE_BREATHING_LIGHT_8BIT_TEST
#define PWM_TABLE_MAX 256
#define PWM_WIDTH_MODE PWM_WAVE_TABLE_8BITS_WIDTH
/* in nanoseconds */
@@ -34,6 +35,7 @@
#define PWM_WAVE_STEP 10000
#define PWM_WAVE_RPT 10
#endif
#endif
struct pwm_test_data {
struct pwm_device *pwm_dev;
@@ -156,8 +158,12 @@ static void pwm_rockchip_test_help_info(void)
pr_info("\n");
pr_info("wave generator demo:\n");
pr_info("echo wave 0 1 true > /dev/pwm_rockchip_misc_test\n");
pr_info("[brathing light demo with 8bit table]\n");
pr_info("echo continuous 0 1 640000 320000 normal > /dev/pwm_rockchip_misc_test\n");
pr_info("[brathing light demo with 16bit table]\n");
pr_info("echo continuous 0 1 1000000 500000 normal > /dev/pwm_rockchip_misc_test\n");
pr_info("[demo for updating both period and duty]\n");
pr_info("echo continuous 0 1 1000 500 normal > /dev/pwm_rockchip_misc_test\n");
pr_info("echo enable 0 1 true > /dev/pwm_rockchip_misc_test\n");
pr_info("------------------------------------------------------------------------------------\n");
}
@@ -200,7 +206,7 @@ static ssize_t pwm_rockchip_test_write(struct file *file, const char __user *buf
struct pwm_device *pdev;
struct pwm_state state;
struct pwm_capture cap_res;
struct rockchip_pwm_wave_table duty_table;
struct rockchip_pwm_wave_table wave_table;
struct rockchip_pwm_wave_config wave_config;
struct rockchip_pwm_biphasic_config biphasic_config;
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
goto exit;
}
#ifdef PWM_WAVE_PRIOD_DUTY_BOTH_UPDATE_TEST
/*
* The output wave should be like:
* _ _ _ _ _
* | | | | | | | | | |
* __| |_| |_| |_| |_| |_____________________________________
*
* | | |
* | five 400K waves | delay 10ms |
* | | |
*/
table[0] = 2500;
table[1] = 500000; // avoid exceeding the 16-bit table
table[2] = 500000;
table[3] = 500000;
table[4] = 500000;
table[5] = 1250;
table[6] = 0;
table[7] = 0;
table[8] = 0;
table[9] = 0;
wave_table.table = table;
wave_table.offset = 0;
wave_table.len = 10;
wave_config.wave_table = &wave_table;
wave_config.clk_src = PWM_SELECT_CLK_PWM;
wave_config.mem_clk_src = PWM_SELECT_CLK_PWM_OSC;
wave_config.width_mode = PWM_WAVE_TABLE_16BITS_WIDTH;
wave_config.update_mode = PWM_WAVE_INCREASING;
wave_config.enable = enable;
wave_config.duty_en = true;
wave_config.period_en = true;
wave_config.clk_rate = 100000000;
wave_config.rpt = 4;
wave_config.duty_max = 9;
wave_config.duty_min = 5;
wave_config.period_max = 4;
wave_config.period_min = 0;
wave_config.offset = 0;
wave_config.middle = 0;
wave_config.max_hold = 0;
wave_config.min_hold = 0;
wave_config.middle_hold = 0;
#else
for (i = 0; i < PWM_TABLE_MAX; i++)
table[i] = i * PWM_WAVE_STEP;
duty_table.table = table;
duty_table.offset = (channel_id % 3) * PWM_TABLE_MAX;
duty_table.len = PWM_TABLE_MAX;
wave_table.table = table;
wave_table.offset = (channel_id % 3) * PWM_TABLE_MAX;
wave_table.len = PWM_TABLE_MAX;
wave_config.duty_table = &duty_table;
wave_config.period_table = NULL;
wave_config.wave_table = &wave_table;
wave_config.clk_src = PWM_SELECT_CLK_PWM;
wave_config.mem_clk_src = PWM_SELECT_CLK_PWM_OSC;
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
wave_config.max_hold = 3;
wave_config.min_hold = 0;
wave_config.middle_hold = 2;
#endif
ret = rockchip_pwm_set_wave(pdev, &wave_config);
if (ret) {
@@ -662,8 +714,10 @@ static ssize_t pwm_rockchip_test_write(struct file *file, const char __user *buf
goto exit;
}
#ifndef PWM_WAVE_PRIOD_DUTY_BOTH_UPDATE_TEST
pr_info("%s %s mode for pwm%d_%d: table_len = %d, table_step = %d\n",
argv[2], cmd, controller_id, channel_id, PWM_TABLE_MAX, PWM_WAVE_STEP);
#endif
break;
case PWM_GLOBAL_CTRL:
if (!argv[0]) {