You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
267 lines
8.7 KiB
267 lines
8.7 KiB
/*
|
|
* Copyright (c) Hisilicon Technologies Co., Ltd.. 2021-2021. All rights reserved.
|
|
* Description: pwm proc
|
|
* Author:
|
|
* Create: 2021-05-12
|
|
* Note:
|
|
*/
|
|
|
|
/******************************************************************************/
|
|
/* Includes */
|
|
/******************************************************************************/
|
|
#include "linux/huanglong/securec.h"
|
|
#include "osal_ext.h"
|
|
#include "drv_dev_ext.h"
|
|
|
|
#include "pwm_common.h"
|
|
|
|
/******************************************************************************/
|
|
/* Structure */
|
|
/******************************************************************************/
|
|
typedef struct {
|
|
td_u32 pwm_no;
|
|
td_bool enable;
|
|
} pwm_proc_data;
|
|
|
|
/*******************************************************************************
|
|
Function Implementation
|
|
*******************************************************************************/
|
|
static td_void pwm_proc_gpio_info(td_void)
|
|
{
|
|
pwm_version version = PWM_VERSION_MAX;
|
|
|
|
version = pwm_get_version();
|
|
if (version == PWM_VERSION_V1) {
|
|
osal_proc_echo("one pin in each gpio group(31x8 pin) can be configured to pwm! pwm_no'range:0~248 \n");
|
|
} else if (version == PWM_VERSION_V2) {
|
|
osal_proc_echo("pwm_no= 0 :gpio4_1; pwm_no= 1 :gpio4_2; pwm_no= 2 :gpio0_2; pwm_no= 3 :gpio3_3 \n");
|
|
} else if (version == PWM_VERSION_V3) {
|
|
osal_proc_echo("one pin in each gpio group(21x8 pin) can be configured to pwm! pwm_no'range:0~168 \n");
|
|
} else {
|
|
osal_proc_echo("Not support chip version!\n");
|
|
}
|
|
}
|
|
static td_s32 _pwm_proc_cmd_help(unsigned int argc,
|
|
char (*argv)[PROC_CMD_SINGEL_LENGTH_MAX], td_void *private)
|
|
{
|
|
pwm_version version = PWM_VERSION_MAX;
|
|
version = pwm_get_version();
|
|
td_s32 pwn_no_range[PWM_VERSION_MAX + 1] = {0, 248, 4, 168, 0};
|
|
TD_UNUSED(argc);
|
|
TD_UNUSED(argv);
|
|
TD_UNUSED(private);
|
|
|
|
osal_proc_echo("\n================================================"
|
|
"pwm==================================================\n");
|
|
pwm_proc_gpio_info(); // print the used gpio pin of pwm
|
|
osal_proc_echo("echo command para1 para2 path "
|
|
"explanation\n");
|
|
|
|
osal_proc_echo("echo getpwm 0 > /proc/msp/pwm "
|
|
"Get pwm state para1:pwm_no(0~%-3d) (1:enable 0:disable)\n", pwn_no_range[version]);
|
|
|
|
osal_proc_echo("echo setpwm 0 0 > /proc/msp/pwm "
|
|
"Set pwm state para1:pwm_no(0~%-3d)\n", pwn_no_range[version]);
|
|
osal_proc_echo(" "
|
|
" para2(1:enable 0:disable)\n");
|
|
|
|
osal_proc_echo("================================================"
|
|
"=====================================================\n");
|
|
return TD_SUCCESS;
|
|
}
|
|
|
|
static td_s32 _pwm_proc_cmd_set_pwm(unsigned int argc,
|
|
char (*argv)[PROC_CMD_SINGEL_LENGTH_MAX], td_void *private)
|
|
{
|
|
td_s32 ret;
|
|
pwm_proc_data proc_data = {0};
|
|
pwm_version version = PWM_VERSION_MAX;
|
|
version = pwm_get_version();
|
|
|
|
TD_UNUSED(private);
|
|
|
|
if (argc < 0x3) {
|
|
return TD_FAILURE;
|
|
}
|
|
|
|
if (argv == TD_NULL) {
|
|
osal_proc_echo("argv is NULL!\n");
|
|
return TD_FAILURE;
|
|
}
|
|
proc_data.pwm_no = (td_u32)osal_strtol(argv[0x1], TD_NULL, 0);
|
|
proc_data.enable = (td_u32)osal_strtol(argv[0x2], TD_NULL, 0);
|
|
|
|
ret = ext_drv_pwm_set_enable(proc_data.pwm_no, proc_data.enable);
|
|
if (ret != TD_SUCCESS) {
|
|
osal_proc_echo("ext_drv_pwm_set_enable failed\n");
|
|
goto out;
|
|
}
|
|
|
|
osal_proc_echo("PWM%d = %s\n", proc_data.pwm_no,
|
|
(proc_data.enable == TD_TRUE) ? "enable" : "disable");
|
|
|
|
out:
|
|
return ret;
|
|
}
|
|
|
|
static td_s32 _pwm_proc_cmd_get_pwm(unsigned int argc,
|
|
char (*argv)[PROC_CMD_SINGEL_LENGTH_MAX], td_void *private)
|
|
{
|
|
td_s32 ret;
|
|
pwm_proc_data proc_data = {0};
|
|
pwm_version version = PWM_VERSION_MAX;
|
|
version = pwm_get_version();
|
|
|
|
TD_UNUSED(private);
|
|
|
|
if (argc < 0x2) {
|
|
return TD_FAILURE;
|
|
}
|
|
|
|
if (argv == TD_NULL) {
|
|
soc_print("argv is NULL!\n");
|
|
return TD_FAILURE;
|
|
}
|
|
proc_data.pwm_no = (td_u32)osal_strtol(argv[1], TD_NULL, 0);
|
|
|
|
ret = ext_drv_pwm_get_enable(proc_data.pwm_no, &proc_data.enable);
|
|
if (ret != TD_SUCCESS) {
|
|
soc_print("ext_drv_pwm_get_enable failed\n");
|
|
goto out;
|
|
}
|
|
|
|
soc_print("PWM%d = %s\n", proc_data.pwm_no,
|
|
(proc_data.enable == TD_TRUE) ? "enable" : "disable");
|
|
|
|
out:
|
|
return ret;
|
|
}
|
|
|
|
static td_s32 pwm_v1_proc_read(td_void *seqfile, td_void *private)
|
|
{
|
|
td_s32 ret = TD_SUCCESS;
|
|
ext_drv_pwm_attr attr = {0};
|
|
osal_seq_printf(seqfile, "-------------------------pwm_info-------------------------------\n");
|
|
osal_seq_printf(seqfile, "pwm_no |freq |duty_ratio |gpio_no |\n");
|
|
|
|
pwm_func_call(ret, ext_drv_pwm_get_attr(47, &attr), goto out);
|
|
if (ret == TD_SUCCESS) {
|
|
osal_seq_printf(seqfile, "moto_pwm |%-8d |%-13d |%-21s |\n", attr.freq, attr.duty_ratio, "----");
|
|
}
|
|
osal_seq_printf(seqfile, "================================================================\n");
|
|
out:
|
|
return ret;
|
|
}
|
|
|
|
static td_s32 pwm_v2_proc_read(td_void *seqfile, td_void *private)
|
|
{
|
|
td_s32 ret = TD_SUCCESS;
|
|
td_s32 i;
|
|
ext_drv_pwm_attr attr = {0};
|
|
td_char gpio_no[4L][10L] = {"gpio4_1", "gpio4_2", "gpio0_2", "gpio3_3"};
|
|
osal_seq_printf(seqfile, "-------------------------pwm_info-------------------------------\n");
|
|
osal_seq_printf(seqfile, "pwm_no |freq |duty_ratio |gpio_no |\n");
|
|
|
|
for (i = 0; i < 4L; i++) { /* 5: pwm number 4, led pwm number 1 */
|
|
pwm_func_call(ret, ext_drv_pwm_get_attr(i, &attr), goto out);
|
|
if (ret != TD_SUCCESS) {
|
|
continue;
|
|
}
|
|
osal_seq_printf(seqfile, "%2d |%-8d |%-13d |%-21s |\n", i, attr.freq, attr.duty_ratio, gpio_no[i]);
|
|
}
|
|
osal_seq_printf(seqfile, "================================================================\n");
|
|
out:
|
|
return ret;
|
|
}
|
|
|
|
static td_s32 pwm_v3_proc_read(td_void *seqfile, td_void *private)
|
|
{
|
|
td_s32 ret = TD_SUCCESS;
|
|
td_s32 i;
|
|
td_s32 cnt = 0;
|
|
ext_drv_pwm_attr attr = {0};
|
|
|
|
osal_seq_printf(seqfile, "-------------------------pwm_info-------------------------------\n");
|
|
osal_seq_printf(seqfile, "pwm_no |freq |duty_ratio |gpio_no |\n");
|
|
for (i = 0; i < 21L; i++) { /* 5: pwm number 4, led pwm number 1 */
|
|
pwm_func_call(ret, ext_drv_pwm_get_attr(i, &attr), goto out);
|
|
if (ret != TD_SUCCESS) {
|
|
continue;
|
|
}
|
|
osal_seq_printf(seqfile, "%2d |%-8d |%-13d |%-21s |\n", i, attr.freq, attr.duty_ratio, "----");
|
|
cnt++;
|
|
}
|
|
if (cnt == 0) {
|
|
osal_seq_printf(seqfile, "%2s |%-8s |%-13s |%-21s |\n", "--", "--", "--", "----");
|
|
}
|
|
osal_seq_printf(seqfile, "================================================================\n");
|
|
out:
|
|
return ret;
|
|
}
|
|
|
|
static td_s32 _pwm_proc_read(td_void *seqfile, td_void *private)
|
|
{
|
|
td_s32 ret = TD_SUCCESS;
|
|
pwm_version version = PWM_VERSION_MAX;
|
|
|
|
TD_UNUSED(private);
|
|
|
|
version = pwm_get_version();
|
|
|
|
osal_seq_printf(seqfile, "\n[pwm] %s\n", VERSION_STRING);
|
|
|
|
if (version == PWM_VERSION_V1) {
|
|
ret |= pwm_v1_proc_read(seqfile, private);
|
|
} else if (version == PWM_VERSION_V2) {
|
|
ret |= pwm_v2_proc_read(seqfile, private);
|
|
} else if (version == PWM_VERSION_V3) {
|
|
ret |= pwm_v3_proc_read(seqfile, private);
|
|
} else {
|
|
ret = TD_FAILURE;
|
|
osal_seq_printf(seqfile, "Not support chip version!\n");
|
|
}
|
|
|
|
out:
|
|
return ret;
|
|
}
|
|
|
|
static osal_proc_cmd g_pwm_proc_cmd[] = {
|
|
{"help", _pwm_proc_cmd_help},
|
|
{"setpwm", _pwm_proc_cmd_set_pwm},
|
|
{"getpwm", _pwm_proc_cmd_get_pwm},
|
|
};
|
|
|
|
td_s32 pwm_drv_proc_add(td_void)
|
|
{
|
|
td_s32 ret = TD_SUCCESS;
|
|
td_s32 num = 0;
|
|
td_char proc_name[16] = {0}; /* 16: max length for proc name */
|
|
osal_proc_entry *pwm_proc_entry = TD_NULL;
|
|
|
|
num = snprintf_s(proc_name, sizeof(proc_name), sizeof(proc_name) - 1, "%s", SOC_MOD_PWM_NAME);
|
|
pwm_check_param(ret, TD_FAILURE, num < 0, goto out);
|
|
|
|
pwm_proc_entry = osal_proc_add(proc_name, strlen(proc_name));
|
|
pwm_check_param(ret, TD_FAILURE, pwm_proc_entry == TD_NULL, goto out);
|
|
|
|
pwm_proc_entry->read = _pwm_proc_read;
|
|
pwm_proc_entry->cmd_cnt = (size_t)(sizeof(g_pwm_proc_cmd) / sizeof(osal_proc_cmd));
|
|
pwm_proc_entry->cmd_list = g_pwm_proc_cmd;
|
|
pwm_proc_entry->private = TD_NULL;
|
|
|
|
out:
|
|
return ret;
|
|
}
|
|
|
|
td_s32 pwm_drv_proc_del(const td_s8 *proc_name)
|
|
{
|
|
td_s32 ret = TD_SUCCESS;
|
|
|
|
pwm_check_param(ret, TD_FAILURE, proc_name == TD_NULL, goto out);
|
|
|
|
osal_proc_remove(proc_name, strlen(proc_name));
|
|
|
|
out:
|
|
return ret;
|
|
}
|