From 559aa0ed870d95d91c14d3471747aa5979d7655a Mon Sep 17 00:00:00 2001 From: Damon Ding Date: Sun, 27 Apr 2025 17:05:10 +0800 Subject: [PATCH] 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 --- drivers/pwm/pwm-rockchip-test.c | 70 +++++++++++++++++++++++++++++---- 1 file changed, 62 insertions(+), 8 deletions(-) diff --git a/drivers/pwm/pwm-rockchip-test.c b/drivers/pwm/pwm-rockchip-test.c index 757013141fe5..f596af6e73f0 100644 --- a/drivers/pwm/pwm-rockchip-test.c +++ b/drivers/pwm/pwm-rockchip-test.c @@ -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]) {