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