4G_module/examples/gpio/src/cm_demo_gpio.c

203 lines
6.1 KiB
C

/*********************************************************
* @file cm_demo_gpio.c
* @brief OpenCPU GPIO示例
* Copyright (c) 2021 China Mobile IOT.
* All rights reserved.
* created by zyf 2021/08/30
********************************************************/
/****************************************************************************
* Included Files
****************************************************************************/
#include "stdlib.h"
#include "cm_demo_gpio.h"
#include "cm_gpio.h"
#include "cm_common.h"
#include "cm_iomux.h"
#include "cm_demo_uart.h"
#include "cm_os.h"
/****************************************************************************
* Pre-processor Definitions
****************************************************************************/
/****************************************************************************
* Private Types
****************************************************************************/
/****************************************************************************
* Private Function Prototypes
****************************************************************************/
/****************************************************************************
* Private Data
****************************************************************************/
static int irq_count = 0;
/****************************************************************************
* Private Functions
****************************************************************************/
/****************************************************************************
* Public Functions
****************************************************************************/
void cm_test_gpio_read(unsigned char **cmd, int len)
{
cm_gpio_cfg_t cfg = {0};
cm_gpio_level_e level = 0;
cm_gpio_num_e test_gpio = 0;
cm_iomux_pin_e pin = 0;
cm_iomux_func_e fun = 0;
cm_iomux_func_e fun1 = 0;
cm_gpio_direction_e dir = 0;
char *stopstr = NULL;
if( (cmd == NULL) || (len != 5))
{
cm_demo_printf(" cmd = NULL or cmd len = %d error!\n", len);
return;
}
test_gpio = (cm_gpio_num_e)atoi((char *)cmd[2]);
pin = strtol((char *)cmd[3], &stopstr, 16);
fun = strtol((char *)cmd[4], &stopstr, 16);
cfg.direction = CM_GPIO_DIRECTION_INPUT;
cfg.pull = CM_GPIO_PULL_DOWN;
cm_iomux_set_pin_func(pin, fun);//初始化之前一定要先设置引脚复用
cm_iomux_get_pin_func(pin, &fun1);
if(fun1 !=fun)
{
cm_demo_printf("read gpio_%d set iomux failed\n", test_gpio);
return;
}
cm_gpio_init(test_gpio, &cfg);
cm_iomux_get_pin_func(pin, &fun1);
cm_gpio_get_level(test_gpio, &level);
cm_demo_printf("read gpio_%d level = %d\n", test_gpio, level);
cm_gpio_get_direction(test_gpio, &dir);
cm_demo_printf("read gpio_%d dir = %d\n", test_gpio, dir);
cm_gpio_ioctl(test_gpio, CM_GPIO_CMD_GET_DIRECTION, &dir);
cm_demo_printf("read gpio_%d dir = %d\n", test_gpio, dir);
cm_gpio_ioctl(test_gpio, CM_GPIO_CMD_GET_LEVEL, &level);
cm_demo_printf("read gpio_%d level = %d\n", test_gpio, level);
cm_gpio_deinit(test_gpio);
}
void cm_test_gpio_write(unsigned char **cmd, int len)
{
cm_gpio_cfg_t cfg = {0};
cm_gpio_level_e level = 0;
cm_gpio_num_e test_gpio = 0;
cm_iomux_pin_e pin = 0;
cm_iomux_func_e fun = 0;
char *stopstr = NULL;
if( (cmd == NULL) || (len != 6))
{
cm_demo_printf(" cmd = NULL or cmd len = %d error!\n", len);
return;
}
test_gpio = atoi((char *)cmd[2]);
pin = strtol((char *)cmd[3], &stopstr, 16);
fun = strtol((char *)cmd[4], &stopstr, 16);
level = atoi((char *)cmd[5]);
if((level == CM_GPIO_LEVEL_HIGH) ||(level == CM_GPIO_LEVEL_LOW))
{
cfg.direction = CM_GPIO_DIRECTION_OUTPUT;
cfg.pull = CM_GPIO_PULL_UP;
cm_iomux_set_pin_func(pin, fun);//初始化之前一定要先设置引脚复用
cm_gpio_init(test_gpio, &cfg);
cm_gpio_set_level(test_gpio, level);
cm_demo_printf("set gpio_%d level = %d\n", test_gpio, level);
}
else
{
cm_demo_printf("set gpio_%d level = %d,please set 0 or 1\n", test_gpio, level);
}
}
static void cm_test_gpio_irq_callback(void)
{
irq_count++;//不能处理打印和耗时任务
}
void cm_test_gpio_irq(unsigned char **cmd, int len)
{
cm_gpio_cfg_t cfg = {0};
cm_gpio_num_e test_gpio = 0;
cm_iomux_pin_e pin = 0;
cm_iomux_func_e fun = 0;
char *stopstr = NULL;
if( (cmd == NULL) || (len != 5))
{
cm_demo_printf(" cmd = NULL or cmd len = %d error!\n", len);
return;
}
irq_count = 0;
test_gpio = atoi((char *)cmd[2]);
pin = strtol((char *)cmd[3], &stopstr, 16);
fun = strtol((char *)cmd[4], &stopstr, 16);
cfg.direction = CM_GPIO_DIRECTION_INPUT;
cfg.pull = CM_GPIO_PULL_DOWN;
cm_iomux_set_pin_func(pin, fun);//初始化之前一定要先设置引脚复用
cm_gpio_init(test_gpio, &cfg);
cm_gpio_interrupt_register(test_gpio, cm_test_gpio_irq_callback);
cm_gpio_interrupt_enable(test_gpio, CM_GPIO_IT_EDGE_FALLING);
}
void cm_test_acqure_irq_count(unsigned char **cmd, int len)
{
if( (cmd == NULL) || (len != 2))
{
cm_demo_printf(" cmd = NULL or cmd len = %d error!\n", len);
return;
}
cm_demo_printf(" gpio irq_count = %d!\n", irq_count);
}
void cm_test_gpio_deinit(unsigned char **cmd, int len)
{
cm_gpio_num_e test_gpio = 0;
if( (cmd == NULL) || (len != 3))
{
cm_demo_printf(" cmd = NULL or cmd len = %d error!\n", len);
return;
}
test_gpio = atoi((char *)cmd[2]);
cm_gpio_deinit(test_gpio);
}
void cm_test_pin_cmd(unsigned char **cmd, int len)
{
if( (cmd == NULL) || (len != 5))
{
cm_demo_printf(" cmd = NULL or cmd len = %d error!\n", len);
return;
}
cm_iomux_pin_e pin = atoi((char *)cmd[2]);
cm_iomux_pincmd_e pin_cmd = atoi((char *)cmd[3]);
uint8_t cmd_arg = atoi((char *)cmd[4]);
cm_iomux_set_pin_cmd(pin,pin_cmd,cmd_arg);
}