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

/*
* 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;
}