mirror of
https://github.com/hardkernel/linux.git
synced 2026-06-07 19:30:30 +09:00
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:
@@ -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]) {
|
||||
|
||||
Reference in New Issue
Block a user