blob: df94926d7b85c49da0fa815dd4fb4808febe2d4c [file] [log] [blame]
/**
* \file gpio-test.c
* \brief A Documented file.
*
* Detailed description
* \Author: Sniper <js.wang@mobiletek.cn>
* \Version: 1.0.0
* \Date: 2022-04-26
*/
#include <stdio.h>
#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <errno.h>
#include <limits.h>
#include <sys/wait.h>
#include <unistd.h>
#include <sys/mount.h>
#include <sys/mman.h>
#include <ctype.h>
#include <stdbool.h>
#include <cutils/properties.h>
#include "mbtk_gpio_def.h"
#include "gpio-define.h"
#ifndef TRUE
#define TRUE 1 /* Boolean true value. */
#endif
#ifndef FALSE
#define FALSE 0 /* Boolean false value. */
#endif
#define gpio_log(...) if(gpio_debug)printf(__VA_ARGS__)
#define HWMAP_DEVICE "/dev/hwmap"
#define PAGE_OFFS_BITS(pgsz) ((unsigned int)(pgsz)-1)
#define PAGE_MASK_BITS(pgsz) (~PAGE_OFFS_BITS(pgsz))
#define STR_MAX_LEN 220
typedef enum {
MBTK_ADC0 = 0, /* ADC 0 */
MBTK_ADC1 /* ADC 1 */
} mbtk_adc_enum;
static int gpio_debug = 0;
#define DEBUG_GPIO_TEST 1
/**/
#define GPIO_MAX_CURRENT (7<<10) //设置GPIO最大输出电流
#define GPIO_STRONG_PULLUP (1<<3) //设置GPIO强上拉
#define GPIO_PULLUP_ENABLE ((1<<15)|(1<<14)) //GPIO上拉
#define GPIO_PULLDOWN_ENABLE ((1<<15)|1<<13) //GPIO下拉
#define MBTK_GPIO_OUTPUT 1
#define MBTK_GPIO_INPUT 0
#if (defined(MBTK_PROJECT_L508_X6) || defined(MBTK_PROJECT_T108))
struct gpio_register_function gpio_func_register[128] = {
{GPIO_FUNC_GPIO_00, 0},
{GPIO_FUNC_GPIO_01, 0},
{GPIO_FUNC_GPIO_02, 0},
{GPIO_FUNC_GPIO_03, 0},
{GPIO_FUNC_GPIO_04, 0},
{GPIO_FUNC_GPIO_05, 0},
{GPIO_FUNC_GPIO_06, 0},
{GPIO_FUNC_GPIO_07, 0},
{GPIO_FUNC_GPIO_08, 0},
{GPIO_FUNC_GPIO_09, 0},
{GPIO_FUNC_GPIO_10, 0},
{GPIO_FUNC_GPIO_11, 0},
{GPIO_FUNC_GPIO_12, 0},
{GPIO_FUNC_GPIO_13, 0},
{GPIO_FUNC_GPIO_14, 0},
{GPIO_FUNC_GPIO_15, 0},
{GPIO_FUNC_GPIO_16, 0},
{GPIO_FUNC_GPIO_17, 0},
{GPIO_FUNC_GPIO_18, 0},
{GPIO_FUNC_GPIO_19, 0},
{GPIO_FUNC_GPIO_20, 0},
{GPIO_FUNC_GPIO_21, 0},
{GPIO_FUNC_GPIO_22, 0},
{GPIO_FUNC_GPIO_23, 0},
{GPIO_FUNC_GPIO_24, 0},
{GPIO_FUNC_GPIO_25, 0},
{GPIO_FUNC_GPIO_26, 0},
{GPIO_FUNC_GPIO_27, 0},
{GPIO_FUNC_GPIO_28, 0},
{GPIO_FUNC_GPIO_29, 0},
{GPIO_FUNC_GPIO_30, 0},
{GPIO_FUNC_GPIO_31, 0},
{GPIO_FUNC_GPIO_32, 0},
{GPIO_FUNC_GPIO_33, 0},
{GPIO_FUNC_GPIO_34, 0},
{GPIO_FUNC_GPIO_35, 0},
{GPIO_FUNC_GPIO_36, 0},
{GPIO_FUNC_GPIO_37, 0}, // GPIO_37
{GPIO_FUNC_GPIO_38, 0}, // GPIO_38
{GPIO_FUNC_GPIO_39, 0}, // GPIO_39
{GPIO_FUNC_GPIO_40, 0}, // GPIO_40
{GPIO_FUNC_GPIO_41, 0}, //GPIO_41
{GPIO_FUNC_GPIO_42, 0}, //GPIO_42
{GPIO_FUNC_GPIO_43, 0}, //GPIO_43
{GPIO_FUNC_GPIO_44,0}, //GPIO_44
{GPIO_FUNC_GPIO_45,0}, //GPIO_45
{GPIO_FUNC_GPIO_46,0}, //GPIO_46
{GPIO_FUNC_GPIO_47,0}, //GPIO_47
{GPIO_FUNC_SDIO_DAT3, 1}, //GPIO_48
{GPIO_FUNC_GPIO_49, 0},
{GPIO_FUNC_GPIO_50, 0},
{GPIO_FUNC_GPIO_51, 0},
{GPIO_FUNC_GPIO_52, 0},
{GPIO_FUNC_GPIO_53, 0},
{GPIO_FUNC_GPIO_54, 0},
{GPIO_FUNC_SDIO_DAT2, 1}, //GPIO_55
{GPIO_FUNC_SDIO_DAT1, 1}, //GPIO_56
{GPIO_FUNC_SDIO_DAT0, 1}, //GPIO_57
{GPIO_FUNC_SDIO_CMD, 1}, //GPIO_58
{GPIO_FUNC_SDIO_CLK, 1}, //GPIO_59
{GPIO_FUNC_GPIO_60, 0},
{0,0},{0,0},{0,0},{0,0},
{0,0},{0,0},
{GPIO_FUNC_DVL_0, 1},//GPIO_67
{GPIO_FUNC_DVL_1, 1},//GPIO_68
{GPIO_FUNC_GPIO_69, 0},
{GPIO_FUNC_GPIO_70, 0},
{GPIO_FUNC_QSPI_DAT3, 1}, //GPIO_71
{GPIO_FUNC_QSPI_DAT2, 1}, //GPIO_72
{GPIO_FUNC_QSPI_DAT1, 1}, //GPIO_73
{GPIO_FUNC_QSPI_DAT0, 1}, //GPIO_74
{GPIO_FUNC_QSPI_CLK, 1}, //GPIO_75
{GPIO_FUNC_QSPI_CS1, 1}, //GPIO_76
{GPIO_FUNC_GPIO_77, 0},
{GPIO_FUNC_GPIO_78, 0},
{GPIO_FUNC_GPIO_79, 0},
{GPIO_FUNC_GPIO_80, 0},
{GPIO_FUNC_USIM_UCLK, 1},//GPIO_81
{GPIO_FUNC_USIM_UIO, 1},//GPIO_82
{GPIO_FUNC_USIM_URSTn, 1},//GPIO_83
{GPIO_FUNC_MMC1_DAT3,5}, //GPIO_84
{GPIO_FUNC_MMC1_DAT2,5}, //GPIO_85
{GPIO_FUNC_MMC1_DAT1,5}, //GPIO_86
{GPIO_FUNC_MMC1_DAT0,5}, //GPIO_87
{GPIO_FUNC_MMC1_CMD,5}, //GPIO_88
{GPIO_FUNC_MMC1_CLK,5}, //GPIO_89
{GPIO_FUNC_MMC1_CD,1}, //GPIO_90
{0,0},
{0,0},{0,0},{0,0},{0,0},
{0,0},{0,0},{0,0},
{GPIO_FUNC_USB_ID, 1},//GPIO_99
{0,0},{0,0},{0,0},{0,0},
{0,0},{0,0},{0,0},{0,0},
{0,0},{0,0},{0,0},{0,0},
{0,0},{0,0},{0,0},{0,0},
{0,0},
{GPIO_FUNC_PRI_TDI, 1}, //GPIO_117
{GPIO_FUNC_PRI_TMS, 1}, //GPIO_118
{GPIO_FUNC_PRI_TCK, 1}, //GPIO_119
{GPIO_FUNC_PRI_TDO, 1}, //GPIO_120
{GPIO_FUNC_QSPI_VMODE_GPIO, 1}, //GPIO_121
{GPIO_FUNC_VBUS_DRV, 1}, //GPIO_122
{GPIO_FUNC_CLK_REQ, 1}, //GPIO_123
{0,0},
{GPIO_FUNC_VCXO_REQ, 1}, //GPIO_125
{0,0}, //GPIO_126
{GPIO_FUNC_VCXO_OUT, 1}, //GPIO_127
{0,0},
};
#else
struct gpio_register_function gpio_func_register[128] = {
{GPIO_FUNC_GPIO_00, 0},
{GPIO_FUNC_GPIO_01, 0},
{GPIO_FUNC_GPIO_02, 0},
{GPIO_FUNC_GPIO_03, 0},
{GPIO_FUNC_GPIO_04, 0},
{GPIO_FUNC_GPIO_05, 0},
{GPIO_FUNC_GPIO_06, 0},
{GPIO_FUNC_GPIO_07, 0},
{GPIO_FUNC_GPIO_08, 0},
{GPIO_FUNC_GPIO_09, 0},
{GPIO_FUNC_GPIO_10, 0},
{GPIO_FUNC_GPIO_11, 0},
{GPIO_FUNC_GPIO_12, 0},
{GPIO_FUNC_GPIO_13, 0},
{GPIO_FUNC_GPIO_14, 0},
{GPIO_FUNC_GPIO_15, 0},
{GPIO_FUNC_GPIO_16, 0},
{GPIO_FUNC_GPIO_17, 0},
{GPIO_FUNC_GPIO_18, 0},
{GPIO_FUNC_GPIO_19, 0},
{GPIO_FUNC_GPIO_20, 0},
{GPIO_FUNC_GPIO_21, 0},
{GPIO_FUNC_GPIO_22, 0},
{GPIO_FUNC_GPIO_23, 0},
{GPIO_FUNC_GPIO_24, 0},
{GPIO_FUNC_GPIO_25, 0},
{GPIO_FUNC_GPIO_26, 0},
{GPIO_FUNC_GPIO_27, 0},
{GPIO_FUNC_GPIO_28, 0},
{GPIO_FUNC_GPIO_29, 0},
{GPIO_FUNC_GPIO_30, 0},
{GPIO_FUNC_GPIO_31, 0},
{GPIO_FUNC_GPIO_32, 0},
{GPIO_FUNC_GPIO_33, 0},
{GPIO_FUNC_GPIO_34, 0},
{GPIO_FUNC_GPIO_35, 0},
{GPIO_FUNC_GPIO_36, 0},
{GPIO_FUNC_MMC1_DAT3, 5}, // GPIO_37
{GPIO_FUNC_MMC1_DAT2, 5}, // GPIO_38
{GPIO_FUNC_MMC1_DAT1, 5}, // GPIO_39
{GPIO_FUNC_MMC1_DAT0, 5}, // GPIO_40
{GPIO_FUNC_MMC1_CMD, 5}, //GPIO_41
{GPIO_FUNC_MMC1_CLK, 5}, //GPIO_42
{GPIO_FUNC_MMC1_CD , 1}, //GPIO_43
{0,0},{0,0},{0,0},{0,0},
{GPIO_FUNC_SDIO_DAT3, 1}, //GPIO_48
{GPIO_FUNC_GPIO_49, 0},
{GPIO_FUNC_GPIO_50, 0},
{GPIO_FUNC_GPIO_51, 0},
{GPIO_FUNC_GPIO_52, 0},
{GPIO_FUNC_GPIO_53, 0},
{GPIO_FUNC_GPIO_54, 0},
{GPIO_FUNC_SDIO_DAT2, 1}, //GPIO_55
{GPIO_FUNC_SDIO_DAT1, 1}, //GPIO_56
{GPIO_FUNC_SDIO_DAT0, 1}, //GPIO_57
{GPIO_FUNC_SDIO_CMD, 1}, //GPIO_58
{GPIO_FUNC_SDIO_CLK, 1}, //GPIO_59
{GPIO_FUNC_GPIO_60, 0},
{0,0},{0,0},{0,0},{0,0},
{0,0},{0,0},
{GPIO_FUNC_DVL_0, 1},//GPIO_67
{GPIO_FUNC_DVL_1, 1},//GPIO_68
{GPIO_FUNC_GPIO_69, 0},
{GPIO_FUNC_GPIO_70, 0},
{GPIO_FUNC_QSPI_DAT3, 1}, //GPIO_71
{GPIO_FUNC_QSPI_DAT2, 1}, //GPIO_72
{GPIO_FUNC_QSPI_DAT1, 1}, //GPIO_73
{GPIO_FUNC_QSPI_DAT0, 1}, //GPIO_74
{GPIO_FUNC_QSPI_CLK, 1}, //GPIO_75
{GPIO_FUNC_QSPI_CS1, 1}, //GPIO_76
{GPIO_FUNC_GPIO_77, 0},
{GPIO_FUNC_GPIO_78, 0},
{GPIO_FUNC_GPIO_79, 0},
{GPIO_FUNC_GPIO_80, 0},
{GPIO_FUNC_USIM_UCLK, 1},//GPIO_81
{GPIO_FUNC_USIM_UIO, 1},//GPIO_82
{GPIO_FUNC_USIM_URSTn, 1},//GPIO_83
{0,0},{0,0},{0,0},{0,0},
{0,0},{0,0},{0,0},{0,0},
{0,0},{0,0},{0,0},{0,0},
{0,0},{0,0},{0,0},
{GPIO_FUNC_USB_ID, 1},//GPIO_99
{0,0},{0,0},{0,0},{0,0},
{0,0},{0,0},{0,0},{0,0},
{0,0},{0,0},{0,0},{0,0},
{0,0},{0,0},{0,0},{0,0},
{0,0},
{GPIO_FUNC_PRI_TDI, 1}, //GPIO_117
{GPIO_FUNC_PRI_TMS, 1}, //GPIO_118
{GPIO_FUNC_PRI_TCK, 1}, //GPIO_119
{GPIO_FUNC_PRI_TDO, 1}, //GPIO_120
{GPIO_FUNC_QSPI_VMODE_GPIO, 1}, //GPIO_121
{GPIO_FUNC_VBUS_DRV, 1}, //GPIO_122
{GPIO_FUNC_CLK_REQ, 1}, //GPIO_123
{0,0},
{GPIO_FUNC_VCXO_REQ, 1}, //GPIO_125
{GPIO_FUNC_VCXO_OUT, 1}, //GPIO_126
{0,0},
};
#endif
static int mbtk_gpio_adc(channel)
{
int ret = 0;
ret = mbtk_adc_get(channel);
#if DEBUG_GPIO_TEST
printf("ADC_%d_value =%d\n", channel, ret);
#endif
if(ret >= 500 ){ //TODO: 各项目高电平标准?
ret = 1;
}
else if (ret>=0 && ret<=480){
ret = 0;
}
else{
ret = -1;
}
return ret;
}
static int hwacc_register(int rw, unsigned int addr, unsigned int *data)
{
int fid;
unsigned int pagesize, len, len_aligned;
unsigned int addr_aligned;
volatile unsigned int *pa;
void *vpa;
len = pagesize = sysconf(_SC_PAGESIZE);
if((fid = open(HWMAP_DEVICE, O_RDWR)) < 0)
{
printf("Failed to open %s\n", HWMAP_DEVICE);
exit(-1);
}
// Align the length so the mapped area is page-aligned and contains the requested area
addr_aligned = addr & PAGE_MASK_BITS(pagesize);
len_aligned =((addr + len - addr_aligned) + pagesize - 1) & PAGE_MASK_BITS(pagesize);
/* Notes on flags: MAP_PRIVATE results in copy on write; MAP_SHARED allows normal write */
/* MAP_SHARED required O_RDWR in open above, otherwise mmap fails with errno=EACCES */
/* Notes on prot: PROT_WRITE allows read and write; PROT_READ allows read only */
/* Notes on off: an unsigned 32-bit value, should be aligned to page size according to mmap manpage */
if((vpa = mmap(0, len_aligned, PROT_READ|PROT_WRITE, MAP_SHARED, fid, addr_aligned)) == MAP_FAILED)
{
printf("mmap failed (%d)\n", errno);
}
else
{
pa = (volatile unsigned int *)((unsigned char *)vpa + (addr & PAGE_OFFS_BITS(pagesize)));
if(rw == 0)
{
*data = *pa;
gpio_log("Value read from 0x%.8x via MVA=0x%p is 0x%.8x\n", addr, pa, *data);
}
else if(rw == 1)
{
*pa = *data;
gpio_log("Value %.8x written to 0x%.8x via MVA=0x%p\n", *data, addr, pa);
#if defined(HWACC_DEBUG)
{
unsigned int val;
val = *pa;
printf("Value read from 0x%.8x via MVA=0x%p is 0x%.8x\n", addr, pa, val);
}
#endif
}
munmap(vpa, len);
}
close(fid);
return 0;
}
/*
设置GPIO 模式:第一步读GPIO22默认function
root@OpenWrt:/# hwacc r 0xd401e134
Option = r Addr = d401e134
Value read from 0xd401e134 via MVA=0x0xb6fc3134 is 0x0000d040 //默认GPIO功能
Bit0~bit2值对应上面表格各function,0代表GPIO功能
*/
static int gpio_register_read(int reg)
{
int ret = -1;
#if 0
FILE * fp;
// "/bin/hwacc r 0xd401e134";
char command[36] = {0};
char buffer[1024];
int i = 0;
sprintf(command, "/bin/hwacc r 0x%x", reg);
fp = popen(command, "r");
while(1)
{
if( fgets (buffer, sizeof(buffer), fp)!=NULL ) {
buffer[strlen(buffer) - 1] = 0;
// gpio_log("out [%d]: %s\n", strlen(buffer), buffer);
}else{
break;
}
i = strstr_n(buffer, "is");
if(i)
{
ret = str_to_hex(&buffer[i + 2]);
gpio_log("read 0x%x value:%s, %x\n", reg, &buffer[i + 2], ret);
}
}
pclose(fp);
#else
#ifndef MBTK_PROJECT_PN1803
usleep(50);
#endif
hwacc_register(0, reg, &ret);
#ifndef MBTK_PROJECT_PN1803
usleep(50);
#endif
#endif
return ret;
}
/*
设置输入输出状态,设置PDR寄存器GPIO22为output
root@OpenWrt:/# hwacc w 0xD401900c 0x00c03800
Option = w Addr = d401900c Data=00c03800
Value 00c03800 written to 0xd401900c via MVA=0x0xb6f9f00c
*/
static void gpio_register_write(int reg, int value)
{
#if 0
FILE * fp;
// "/bin/hwacc w 0xD401900c 0x00c03800"
char command[36] = {0};
char buffer[1024];
sprintf(command, "/bin/hwacc w 0x%x 0x%x", reg, value);
gpio_log("command: %s\n", command);
fp = popen(command, "r");
while(1)
{
if( fgets (buffer, sizeof(buffer), fp)!=NULL ) {
gpio_log("%s\n", buffer);
}else{
break;
}
}
pclose(fp);
#else
#ifndef MBTK_PROJECT_PN1803
usleep(50);
#endif
hwacc_register(1, reg, &value);
#ifndef MBTK_PROJECT_PN1803
usleep(50);
#endif
#endif
}
/*
AF SEL<p>This field is used for alternate function selection for a pin.
It selects between the eight possible alternate functions for the pin.
Alternate function 0 is always the reset case.
<p>0x0 = Alternate function 0 (primary function at reset)
<p>0x1 = Alternate function 1
<p>0x2 = Alternate function 2
<p>0x3 = Alternate function 3
<p>0x4 = Alternate function 4
<p>0x5 = Alternate function 5
<p>0x6 = Alternate function 6
<p>0x7 = Alternate function 7
*/
static int gpio_register_set_func_0(int port)
{
int ret;
struct gpio_register_function *reg = NULL;
if(port > 128)
return -1;
reg = &gpio_func_register[port];
if(0 == reg->reg)
return -1;
ret = gpio_register_read(reg->reg);
if((ret & 0x7) != reg->func_gpio)
{
//printf("Gpio set func [%d] [0x%x]!\n", reg->func_gpio, (ret & 0xfffffff8) | reg->func_gpio);
gpio_register_write(reg->reg, (ret & 0xfffffff8) | reg->func_gpio);
}
return 0;
}
/*
设置GPIO 方向
读取输入输出状态,读PDR寄存器:0x0c
root@OpenWrt:/# hwacc r 0xD401900c
Option = r Addr = d401900c
Value read from 0xd401900c via MVA=0x0xb6f3900c is 0x00803800 //bit22为0,代表Input
*/
static void gpio_register_set_direction(int port, int dir)
{
int ret;
int reg = 0xD4019000;
if(port > (32 - 1))
reg = 0xD4019004;
if(port > (32 * 2 - 1))
reg = 0xD4019008;
if(port > (32 * 3 - 1))
reg = 0xD4019100;
reg += 0x0c;
port = port % 0x20;
ret = gpio_register_read(reg);
//printf("[Direction] reg_value=%x\n", ret);
// 设置 输出 0 && 1
if(!(ret & (0x1 << port)) && dir)
{
gpio_register_write(reg, ret | (0x1 << port)); //set the gpio bit
//printf("[Direction out] reg_value=%x\n", gpio_register_read(reg));
}
// 设置 输入 1 && 0
if((ret & (0x1 << port)) && !dir)
{
#if 1
gpio_register_write(reg, ret & (~(0x1 << port))); //clear the gpio bit,mbtk_tanggaoyou
#else
gpio_register_write(reg, ret | !(0x1 << port)); //这是错误配置,实际没有任何作用,还是原来的值
#endif
//printf("[Direction in] reg_value=%x\n", gpio_register_read(reg));
}
}
/*
设置GPIO 输出电平
读取电平状态,先读PLR寄存器:0x00
root@OpenWrt:/# hwacc r 0xD4019000
Option = r Addr = d4019000
Value read from 0xd4019000 via MVA=0x0xb6f1c000 is 0x81e82a30
对应下面具体BIT
1000 0001 1110 1000 0010 1010 0011 0000 BIT22默认电平高
设置输出高:设置PSR寄存器:0x18(只写寄存器)
root@OpenWrt:/# hwacc w 0xD4019018 0x400000
Option = w Addr = d4019018 Data=00400000
Value 00400000 written to 0xd4019018 via MVA=0x0xb6f56018 //bit22写1,输出高
设置输出低:设置PCR寄存器:0x24
root@OpenWrt:/# hwacc w 0xD4019024 0x400000
Option = w Addr = d4019024 Data=00400000
Value 00400000 written to 0xd4019024 via MVA=0x0xb6faa024 //Bit22写1,GPIO22输出低
*/
static void gpio_register_set_value(int port, int value)
{
int ret;
int reg = 0xD4019000;
if(port > (32 - 1))
reg = 0xD4019004;
if(port > (32 * 2 - 1))
reg = 0xD4019008;
if(port > (32 * 3 - 1))
reg = 0xD4019100;
if(value)
{
reg += 0x18;
}
else
reg += 0x24;
port = port % 0x20;
ret = gpio_register_read(reg);
//printf("[Value] reg_value=%x\n", gpio_register_read(0xD4019004));
// 设置 高电平 0 && 1
if(value)
{
gpio_register_write(reg, ret | (0x1 << port));
//printf("[Value high] reg_value=%x\n", gpio_register_read(0xD4019004));
return;
}
// 设置 低电平 1 && 0
if(!(ret & (0x1 << port)) && !value)
{
gpio_register_write(reg, ret | (0x1 << port));
//printf("[Value low] reg_value=%x\n", gpio_register_read(0xD4019004));
}
}
/*
读取电平状态,先读PLR寄存器:0x00
root@OpenWrt:/# hwacc r 0xD4019000
Option = r Addr = d4019000
Value read from 0xd4019000 via MVA=0x0xb6f1c000 is 0x81e82a30
对应下面具体BIT
1000 0001 1110 1000 0010 1010 0011 0000 BIT22默认电平高
*/
static int gpio_register_get_value(int port)
{
int ret = -1;
int reg = 0xD4019000;
if(port > (32 - 1))
reg = 0xD4019004;
if(port > (32 * 2 - 1))
reg = 0xD4019008;
if(port > (32 * 3 - 1))
reg = 0xD4019100;
port = port % 0x20;
ret = gpio_register_read(reg);
if(ret & (0x1 << port))
{
return 1;
}
return 0;
}
void gpio_debug_set(int enable)
{
gpio_debug = enable;
}
#if defined(MBTK_PROJECT_PN1803)
int gpio_register_test_out(int port, int value)
{
int ret;
int i;
int valueh = 0;
int valuel = 1;
//printf("Gpio port [%d] test start!\n", port);
ret = gpio_register_set_func_0(port); //设功能为GPIO
if(ret){
printf("gpio_port can't support!\n");
return -1;
}
gpio_register_set_direction(port, 1); //设方向为输出
ret = gpio_register_get_value(port);
//printf("gpio default value is : %d.\n", ret);
//[High]
for(i = 0; i <= 10; i++){
gpio_register_set_value(port, 1);
usleep(50);
valueh = gpio_register_get_value(port);
//printf("set high? %d\n",valueh);
if(1 == valueh){
break;
}
}
//usleep(10000);
for(i = 0; i <= 35; i++){
ret = mbtk_gpio_adc(0);
usleep(3000);
if(1 == ret){
break;
}
}
if(1 != ret){
ret=-1;
goto exit;
}
printf("******gpio should is high: %d.******\n", ret);
//[Low]
usleep(200);
for(i = 0; i <= 10; i++){
gpio_register_set_value(port, 0); //输出低
usleep(50);
valuel = gpio_register_get_value(port);
//printf("set low? %d\n",valuel);
if(0 == valuel){
break;
}
}
//usleep(10000);
for(i = 0; i <= 35; i++){
ret = mbtk_gpio_adc(0);
usleep(3000);
if(0 == ret){
break;
}
}
printf("******gpio should is low: %d.******\n", ret);
if(0 != ret){
ret=-1;
goto exit;
}
exit:
//gpio_register_set_direction(port, 0); //设方向为输入
return ret;
}
int mbtk_at_gpio(bool gnss_support, void* arg)
{
int test_gpio[] = {
56, 55, 58, 57, 48, 59, 12, 20, 5, 43, 21,
49, 50, 27, 28, 26, 25, 16, 17, 15, 126, 125,
4, 0, 3, 18, 7, 6, 1, 2, /*54,*/ 19, 13,
32, 31, 23, 24, 22, /*122,*/ 33, 35, 36, 34, 14,
99,/* 53,*/ 37, 38, 39, 40, 41, 42};
int i, j, ret, total, n = 0;
int *fail_io = (int *)arg;
total = (sizeof(test_gpio)/sizeof(int));
//printf("Start test gpio total: %d\n", total);
/* [1 all gpio set to low] */
for(j = 0; j < 6 ; j++){
for(i = 0; i < total; i++){
gpio_register_set_func_0(test_gpio[i]);
gpio_register_set_direction(test_gpio[i], 1);
gpio_register_set_value(test_gpio[i], 0);
}
//usleep(10000);
for(i = 0; i <= 35; i++){
ret = mbtk_gpio_adc(0);
usleep(3000);
if(0 == ret){
break;
}
}
printf("pre set ADC: %d, times: %d\n",ret, j);
if(0 == ret){
break;
}
}
if(0 != ret){
printf("Fail, please retest");
return -1;
}
/* [2 GPIOTEST] */
for(i = 0; i < total; i++){
ret = gpio_register_test_out(test_gpio[i], 0);
if(-1 == ret){
printf("!!!!!!!!!!!!gpio [%d] test failed!!!!!!!!!!!!\n", test_gpio[i]);
fail_io[n] = test_gpio[i];
n++;
}else{
//printf("############gpio [%d] test success############\n", test_gpio[i]);
}
}
mbtk_adc_close();
return n;
}
#elif defined(MBTK_PROJECT_L508)
#define READ_GPIO_NUM 22
#define DEBUG_GPIO_TEST 1
mbtk_gpio_test_pin_and_gpio *p_test_gpio =NULL;
mbtk_gpio_test_pin_and_gpio *p_gnss_gpio = NULL;
int test_gpio_group_total_pin = 0;
int gnss_gpio_group_total_pin = 0;
int gpio_test_set_group_pin_to_low(mbtk_gpio_test_pin_and_gpio *p_pin_group_array, int total_num)
{
int i;
int gpio_num = 0;
int ret = 0;
if(p_pin_group_array == NULL)
return -1;
for(i=0; i < total_num; i++)
{
gpio_num = p_pin_group_array[i].gpio_num;
ret += gpio_register_set_func_0(gpio_num);
gpio_register_set_direction(gpio_num, MBTK_GPIO_OUTPUT);
gpio_register_set_value(gpio_num, 0);
}
return ret;
}
int gpio_test_init(void)
{
int i,j,ret;
int gpio_num = 0;
system("i2cset -y -f 2 0x31 0x12 0x46");
system("echo 53 > /sys/class/gpio/export"); //gnss uart rx
system("echo out > /sys/class/gpio/gpio53/direction");
system("echo 54 > /sys/class/gpio/export");//gnss uart tx
system("echo out > /sys/class/gpio/gpio54/direction");
system("echo 22 > /sys/class/gpio/export");//check pin
gpio_register_set_func_0(READ_GPIO_NUM);
gpio_register_set_direction(READ_GPIO_NUM, 1); //输出
usleep(500);
/*
GPIO22默认是上拉,如果改成GPIO输入模式,其PIN脚电压是高电平,必须改成下拉后GPIO22才处于低电平状态,否则测试PIN拉低失败
*/
gpio_register_set_direction(READ_GPIO_NUM, MBTK_GPIO_INPUT); //设置输入模式
gpio_register_write(GPIO_FUNC_GPIO_22,0xb040); //PULL DOWN
gpio_test_set_group_pin_to_low(p_gnss_gpio,gnss_gpio_group_total_pin); //set all gnss reserver pin to low
/* [1 all gpio set to low] */
for(j = 0; j < 6 ; j++){
gpio_test_set_group_pin_to_low(p_test_gpio,test_gpio_group_total_pin);
for(i = 0; i <= 5; i++){
ret = gpio_register_get_value(READ_GPIO_NUM);
if(0 == ret){
break;
}
usleep(3000);
}
if(0 == ret){
break;
}
}
if(0 != ret){
printf("[GPIOTEST]set all low Fail, please retest\n");
return -1;
}
printf("[GPIOTEST]pre set SUCCESS\n");
return 0;
}
int gpio_test(void* arg,int index,mbtk_gpio_test_pin_and_gpio *p_pin_group_array,int total)
{
int ret,i;
int *fail_io = (int *)arg;
int failed_num = index;
int gpio_num = 0;
int pin_num = 0;
bool falied_flag = FALSE;
for(i = 0; i < total; i++){
gpio_num = p_pin_group_array[i].gpio_num;
pin_num = p_pin_group_array[i].pin_num;
falied_flag = FALSE;
#if DEBUG_GPIO_TEST
ret = gpio_register_get_value(gpio_num);
printf("[GPIOTEST]pin_num%d default value= %d\n", pin_num, ret);
#endif
//set high
gpio_register_set_value(gpio_num, 1);
#if DEBUG_GPIO_TEST
ret = gpio_register_get_value(gpio_num);
printf("[GPIOTEST]pin_num%d set high= %d\n", pin_num, ret);
#endif
//get
ret = gpio_register_get_value(READ_GPIO_NUM);
if(1 != ret){
printf("[GPIOTEST]pin%d test high failed\n", pin_num);
falied_flag = TRUE;
}else{
printf("[GPIOTEST]pin[%d] test high success\n", pin_num);
}
//set low
gpio_register_set_value(gpio_num, 0);
#if DEBUG_GPIO_TEST
ret = gpio_register_get_value(gpio_num);
printf("[GPIOTEST]pin_num%d set low= %d\n", pin_num, ret);
#endif
//get
ret = gpio_register_get_value(READ_GPIO_NUM);
if(0 != ret){
printf("[GPIOTEST]pin_num%d test low failed\n", pin_num);
falied_flag = TRUE;
}else{
printf("[GPIOTEST]pin_num%d test low success\n", pin_num);
}
if(falied_flag)
{
fail_io[failed_num] = p_pin_group_array[i].pin_num;
#if DEBUG_GPIO_TEST
printf("[GPIOTEST]NO.%d pin_num%d failed %d\n",i,pin_num, failed_num);
#endif
failed_num++;
}
}
return failed_num;
}
int mbtk_at_gpio(bool gnss_support,void* arg)
{
int n = 0;
mbtk_gpio_test_pin_and_gpio test_gpio[] =
{
//{GPIO , PIN}
{0,100}, //RMII_RX-DV
{1,101}, //RMII_RXD0
{2,102},//RMII_RXD1
{3,103},//RMII_CLK
{6,104},//RMII_TXD0
{7,105},//RMII_TXD1
{15,106},//RMII_TX_EN
{16,109},//RMII_MDC
{17,110},//RMII_MDIO
{18,107},//RMII_INT
{99,16},//USB_ID
{34,9}, //SPI0_CS
{36,8},//SPI0_TXD
{35,7},//SPI0_RXD
{33,6},//SPI0_CLK
{14,51}, //NET_LIGHT
{13,49}, //STATUS LED
{12,50},//WAKE_IN
{49,55}, //I2C SCL
{50,56}, //I2C SDA
{19,53}, //USIM_DET
{43,48}, //SD_DET
{118,52}, //WAKE OUT
{120,54}, //FLIGHT MODE
{20,45}, //NORMAL GPIO
{59,122}, //SDIO_CLK
{56,117}, //SDIO_DATA1
{55,118},//SDIO_DATA2
{58,119},//SDIO_CMD
{48,120},//SDIO_DATA3
{57,121},//SDIO_DATA0
{5,84}, //NORMAL GPIO
{4,30},//NORMAL GPIO
{21,28}, //NORMAL GPIO
{23,69}, //UART_RING
{24,70}, //UART_DCD
{27,73}, //PCM_OUT
{28,74}, //PCM_IN
{26,75}, //PCM_SYNC
{25,76}, //PCM_CLK
{126,112},//NORMAL GPIO or pwm3
{117,123}, //PWM
{125,116}, //CLK_REQ
//{54,114}, //debug uart2, no need be tested
//{53,115}, //debug uart2, no need be tested
};
mbtk_gpio_test_pin_and_gpio GNSS_test_gpio[] = {
{54,114}, //GPS UTXD, UART1_TXD,L508LAN+L508CN(D)+L508EN+L508LEN+L508TLCN NOT CONNECTED
{53,115}, //GPS URXD,UART1-RXD,L508LAN+L508CN(D)+L508EN+L508LEN+L508TLCN NOT CONNECTED
{32,66}, //PIN66,host wake GPS, RTS, L508TLCN_V2+L508LEN_V2+L508EN_V2 NOT CONNECTED
{31,67}, //PIN67,GPS wake Host,CTS, L508TLCN_V2+L508LEN_V2+L508EN_V2 NOT CONNECTED
{123,42},//GPS_EN, L508TLCN_V2+L508LEN_V2+L508EN_V2 NOT CONNECTED
{122,35}, //32K OUT, L508TLCN_V2+L508LEN_V2+L508EN_V2 not connected
};
p_gnss_gpio = GNSS_test_gpio;
gnss_gpio_group_total_pin = (sizeof(GNSS_test_gpio)/sizeof(GNSS_test_gpio[0]));
p_test_gpio = test_gpio;
test_gpio_group_total_pin = (sizeof(test_gpio)/sizeof(test_gpio[0]));
if(!gnss_support)
n = test_gpio_group_total_pin+gnss_gpio_group_total_pin;
else
n = test_gpio_group_total_pin;
printf("[init] L508 XX GPIOTEST v1.3 total pin=%d\n",n);
n = gpio_test_init();
if(-1 == n)
{
goto gpiotest_finished;
}
n = 0;
n = gpio_test(arg,0,p_test_gpio,test_gpio_group_total_pin);
//if the module has gnss chip, don't test the gnss's pins
if(!gnss_support)
{
n = gpio_test(arg,n,p_gnss_gpio,gnss_gpio_group_total_pin);
}
gpiotest_finished:
system("echo 53 > /sys/class/gpio/unexport"); //unexport gnss uart rx
system("echo 54 > /sys/class/gpio/unexport");//unexportgnss uart tx
system("echo 22 > /sys/class/gpio/unexport");//unexportcheck pin
printf("\n[GPIOTEST] Finished %d!!\n\n",n);
return n;
}
#elif defined(MBTK_PROJECT_L509)
//测低
static uint16 mbtk_gpio_test_all_low(mbtk_gpio_paired_info_struct *pin_array, uint16 MAX_pin_num)
{
uint16 index = 0;
uint16 OUT_pin, Read_pin;
uint32 read_high_value;
uint32 read_low_value;
uint16 fail_num = 0;
//int res;
printf("[GPIOTEST][run test all pin low]\n");
for(index = 0; index < MAX_pin_num; index++){
OUT_pin = pin_array[index].output_gpio;
Read_pin = pin_array[index].input_gpio;
//输出低
gpio_register_set_direction(OUT_pin, 1);
gpio_register_set_value(OUT_pin, 0);
//输入脚设为输入
gpio_register_set_direction(Read_pin,0);
}
for(index = 0; index < MAX_pin_num; index++){
OUT_pin = pin_array[index].output_gpio;
Read_pin = pin_array[index].input_gpio;
read_low_value = gpio_register_get_value(Read_pin);
//结果检测
if(read_low_value != 0){
printf("[GPIOTEST][!Low Failed!]: GPIO%d PIN%d\n", Read_pin, pin_array[index].input_pin);
pin_array[index].mbtk_gpio_test_result = 1;
fail_num ++;
}
#if DEBUG_GPIO_TEST
else{
printf("[GPIOTEST][-Low Success-]: GPIO%d \n", Read_pin);
}
#endif
}
return fail_num;
}
//测高
static uint16 mbtk_gpio_test_pin_high(mbtk_gpio_paired_info_struct *pin_array, uint16 MAX_pin_num)
{
uint16 index = 0;
uint16 OUT_pin, Read_pin;
uint32 read_high_value;
uint32 read_low_value;
uint16 fail_num = 0;
int i = 0;
printf("[GPIOTEST][run test pin high]\n");
for(index = 0; index < MAX_pin_num; index++){
OUT_pin = pin_array[index].output_gpio;
Read_pin = pin_array[index].input_gpio;
//设高
gpio_register_set_direction(OUT_pin,1);
gpio_register_set_direction(Read_pin,0);
gpio_register_set_value(OUT_pin, 1);
usleep(10000);
read_high_value = gpio_register_get_value(Read_pin);
#if DEBUG_GPIO_TEST
printf("[GPIOTEST][test_high]: PIN%d: get value =%d \n", pin_array[index].input_pin, read_high_value);
#endif
//设高后重新设低
usleep(10000);
gpio_register_set_value(OUT_pin, 0);
usleep(10000);
for(i = 0; i < 10; i++){
read_low_value = gpio_register_get_value(Read_pin);
if(0 == read_low_value){
break;
}
usleep(20000);
}
#if DEBUG_GPIO_TEST
printf("[GPIOTEST][test_low]: PIN%d: get value =%d \n", pin_array[index].input_pin, read_low_value);
#endif
if(read_high_value != 1 || read_low_value != 0){
printf("[GPIOTEST][!High Failed!]: Gpio%d PIN%d\n", Read_pin,pin_array[index].input_pin);
pin_array[index].mbtk_gpio_test_result = 2;
fail_num ++;
}
#if DEBUG_GPIO_TEST
else{
printf("[GPIOTEST][-High Success-]: Gpio%d \n", Read_pin);
}
#endif
}
return fail_num;
}
static void gpio_test_init_test_gpio_mode(mbtk_gpio_paired_info_struct pin_array[], int MAX_pin_num)
{
int index = 0;
int OUT_pin, Read_pin;
printf("[GPIOTEST] L509 GPIOTEST v2.2 --init\n");
gpio_register_set_func_0(125);
gpio_register_set_direction(125, 1);
gpio_register_set_value(125, 1); //RS2299开关的使能脚
system("i2cset -y -f 2 0x31 0x12 0x46"); //使能0x12地址的VLDO, 某组GPIO的供电
gpio_register_write(GPIO_FUNC_GPIO_53, 0xb040); //GPIO53 DTR set PULL DOWN
for(index = 0; index < MAX_pin_num; index++){
OUT_pin = pin_array[index].output_gpio;
Read_pin = pin_array[index].input_gpio;
pin_array[index].mbtk_gpio_test_result = 0; //init as passed
gpio_register_set_func_0(OUT_pin);
gpio_register_set_func_0(Read_pin);
gpio_register_set_value(OUT_pin, 0);
}
#if DEBUG_GPIO_TEST
printf("[GPIOTEST]gpio_test_init_test_gpio_mode FINISH\n");
#endif
}
int mbtk_at_gpio(bool gnss_support, void* arg)
{
int i, num;
int *fail_io = (int *)arg;
/*OPEN SWITCH */
uint16 test_fail_count = 0;
uint16 test_MAX_pin_num = 0;
char buf[STR_MAX_LEN];
//uint16 str_len = 0;
uint16 temp_len =0;
uint16 Out_pin;
uint16 in_pin;
//uint16 fail_print_num = 0;
mbtk_gpio_paired_info_struct test_pin_array[] ={
//output_pin, output_gpio, input_gpio, input_pin, test_result
{122, 16, 17, 121, 0}, /* RGMII/RMII_MD_CLK <---SW RS2299---> RGMII/RMII_MD_IO */
{78, 7, 2, 73, 0}, /* RGMII/RMII_TX_1 <---SW RS2299---> RGMII/RMII_RXD1 */
{77, 6, 1, 76, 0}, /* RGMII/RMII_TXD0 <---SW RS2299---> RGMII/RMII_RXD0 */
{81, 15, 3, 75, 0}, /* RGMII/RMII_TX_EN <---SW RS2299---> RGMII/RMII_CLK */
{74, 0, 18, 120, 0}, /* RGMII/RMII_RX_DV <---SW RS2299---> RGMII/RMII_INT */
{1, 117, 120, 2, 0}, /* WAKEUP_IN <---SW RS2299---> AP_READY */
{4, 118, 19, 13, 0}, /* FLIGHTMODE <---SW RS2299---> USIM_CD */
{5, 123, 126, 6, 0}, /* NET_MODE <---SW RS2299---> NET_STATUS */
{23, 43, 23, 62, 0}, /* MMC1_CD <---SW RS2299---> UART_RI */
{79, 4, 5, 82, 0}, /* RGMII_RX_2 <---SW RS2299---> RGMII_RX_3 */
{80, 13, 14, 84, 0}, /* RGMII_TX_2 <---SW RS2299---> RGMII_TX_3 */
{129, 48, 55, 130, 0}, /* WLAN_DAT3 <---SW RS2299---> WLAN_DAT2 */
{131, 56, 57, 132, 0}, /* WLAN_DAT1 <---SW RS2299---> WLAN_DAT0 */
{24, 28, 27, 25, 0}, /* PCM_IN <---SW RS2299---> PCM_OUT */
{26, 26, 25, 27, 0}, /* PCM_SYNC <---SW RS2299---> PCM_CLK */
{37, 34, 33, 40, 0}, /* SPI_CS <---SW RS2299---> SPI_CLK */
{38, 36, 35, 39, 0}, /* SPI_DOUT <---SW RS2299---> SPI_DIN */
{133, 59, 58, 134, 0}, /* WLAN_CLK/PCIE_RSTN <---SW RS2299---> WLAN_CMD/PCIE_WK */
{135, 21, 99, 139, 0}, /* WLAN_WAKE_HOST <---SW RS2299---> USB_ID */
{119, 20, 22, 136, 0}, /* RGMII/RMII_RST_N <---SW RS2299---> WLAN_EN */
{83, 12, 122, 118, 0}, /* RGMII_CLK_TX <---SW RS2299---> WLAN_SLP_CLK */
{41, 49, 50, 42, 0}, /* I2C_SCL <---SW RS2299---> I2C_SDA */
{143, 10, 11, 144, 0}, /* GRFC1 <---SW RS2299---> GRFC2 */
{64, 32, 31, 65, 0}, /* UART_CTS <---SW RS2299---> UART_RTS */
{63, 54, 53, 66, 0}, /* UART_DCD <---SW RS2299---> UART_DTR */
};
/* [1]初始化待测GPIO */
test_MAX_pin_num = sizeof(test_pin_array) / sizeof(test_pin_array[0]);
if(gnss_support){ //TODO: When the hardware does not have GNSS, do not test GPIO53, 54
//bad implement, need modify
test_MAX_pin_num = test_MAX_pin_num - 1;
}
gpio_test_init_test_gpio_mode(test_pin_array, test_MAX_pin_num);
/* [2]测试过程 */
test_fail_count = mbtk_gpio_test_all_low(test_pin_array, test_MAX_pin_num);
if(!test_fail_count){ //set all pin to low success
printf("[GPIOTEST]set all pin to low: success\n");
test_fail_count = mbtk_gpio_test_pin_high(&test_pin_array, test_MAX_pin_num);
}
else{
printf("[GPIOTEST]set all pin low: failed num=%d!!!\n", test_fail_count);
}
//memset(buf,0,STR_MAX_LEN);
/* [3]测试结果检测与上报 */
if(test_fail_count ){
//printf( "GPIOTEST Fail %02d PINs:\n", test_fail_count*2);
sprintf(buf, "GPIOTEST Fail %02d PINs:", test_fail_count * 2);
temp_len = strlen(buf);
num = 0;
for(i = 0; i < test_MAX_pin_num; i++){
if(test_pin_array[i].mbtk_gpio_test_result){
Out_pin = test_pin_array[i].output_pin;
in_pin = test_pin_array[i].input_pin;
fail_io[num++] = Out_pin;
fail_io[num++] = in_pin;
}
}
}
else{
printf(buf, "ALL GPIO TEST PASS\r\n");
}
printf("\n[GPIOTEST] Finished !!\n\n");
return test_fail_count * 2;
}
#elif defined(MBTK_PROJECT_L508_X6)
int gpio_register_test_out_0(int port)
{
int ret;
int i;
int valueh = 0;
int valuel = 1;
//printf("Gpio port [%d] test start!\n", port);
ret = gpio_register_set_func_0(port); //设功能为GPIO
if(ret){
printf("gpio_port can't support!\n");
return -1;
}
gpio_register_set_direction(port, 1); //设方向为输出
//ret = gpio_register_get_value(port);
//printf("gpio default value is : %d.\n", ret);
//[High]
for(i = 0; i <= 10; i++){
gpio_register_set_value(port, 1);
usleep(50);
valueh = gpio_register_get_value(port);
//printf("set high? %d\n",valueh);
if(1 == valueh){
break;
}
}
usleep(5000);
for(i = 0; i <= 10; i++){
ret = mbtk_gpio_adc(0);
usleep(3000);
if(1 == ret){
break;
}
}
//printf("******gpio should is high: %d.******\n", ret);
if(1 != ret){
ret=-1;
goto exit;
}
//[Low]
usleep(200);
for(i = 0; i <= 10; i++){
gpio_register_set_value(port, 0); //输出低
usleep(50);
valuel = gpio_register_get_value(port);
//printf("set low? %d\n",valuel);
if(0 == valuel){
break;
}
}
usleep(5000);
for(i = 0; i <= 10; i++){
ret = mbtk_gpio_adc(0);
usleep(3000);
if(0 == ret){
break;
}
}
printf("******gpio should is low: %d.******\n", ret);
if(0 != ret){
ret=-1;
goto exit;
}
exit:
gpio_register_set_value(port, 0);
//gpio_register_set_direction(port, 0); //设方向为输入
return ret;
}
int gpio_register_test_out_1(int port)
{
int ret;
int i;
int valueh = 0;
int valuel = 1;
//printf("Gpio port [%d] test start!\n", port);
ret = gpio_register_set_func_0(port); //设功能为GPIO
if(ret){
printf("gpio_port can't support!\n");
return -1;
}
gpio_register_set_direction(port, 1); //设方向为输出
//ret = gpio_register_get_value(port);
//printf("gpio default value is : %d.\n", ret);
//[High]
for(i = 0; i <= 10; i++){
gpio_register_set_value(port, 1);
usleep(50);
valueh = gpio_register_get_value(port);
//printf("set high? %d\n",valueh);
if(1 == valueh){
break;
}
}
usleep(5000);
for(i = 0; i <= 10; i++){
ret = mbtk_gpio_adc(1);
usleep(3000);
if(1 == ret){
break;
}
}
if(1 != ret){
ret=-1;
goto exit;
}
//printf("******gpio should is high: %d.******\n", ret);
//[Low]
usleep(200);
for(i = 0; i <= 10; i++){
gpio_register_set_value(port, 0); //输出低
usleep(50);
valuel = gpio_register_get_value(port);
//printf("set low? %d\n",valuel);
if(0 == valuel){
break;
}
}
usleep(10000);
for(i = 0; i <= 10; i++){
ret = mbtk_gpio_adc(1);
usleep(3000);
if(0 == ret){
break;
}
}
//printf("******gpio should is low: %d.******\n", ret);
if(0 != ret){
ret=-1;
goto exit;
}
exit:
gpio_register_set_value(port, 0);
//error: no need set direction in gpio_register_set_direction(port, 0);
return ret;
}
int gpio_register_test_out_2(int port_in, int port_out)
{
int ret_in;
int ret_out;
int i;
int valueh = 0;
int valuel = 1;
//printf("Gpio port [%d] test start!\n", port_out);
ret_in = gpio_register_set_func_0(port_in); //设功能为GPIO
ret_out = gpio_register_set_func_0(port_out);
if((ret_in+ret_out)){
printf("gpio_port can't support!\n");
return -1;
}
gpio_register_set_direction(port_out, 1); //设方向为输出
gpio_register_set_direction(port_in, 0); //设方向为输入
//ret_in = gpio_register_get_value(port_in);
//printf("gpio default value is : %d.\n", ret_in);
//[High]
for(i = 0; i <= 10; i++){
gpio_register_set_value(port_out, 1);
usleep(50);
valueh = gpio_register_get_value(port_out);
//printf("set high? %d\n",valueh);
if(1 == valueh){
break;
}
}
usleep(5000);
for(i = 0; i <= 10; i++){
ret_in = gpio_register_get_value(port_in);
usleep(3000);
if(1 == ret_in){
break;
}
}
if(1 != ret_in){
ret_in=-1;
printf("get high failed! \n");
goto exit;
}
//printf("******gpio should is high: %d.******\n", ret_in);
//[Low]
usleep(200);
for(i = 0; i <= 10; i++){
gpio_register_set_value(port_out, 0); //输出低
usleep(50);
valuel = gpio_register_get_value(port_out);
//printf("set low? %d\n",valuel);
if(0 == valuel){
break;
}
}
usleep(5000);
for(i = 0; i <= 10; i++){
ret_in = gpio_register_get_value(port_in);
usleep(3000);
if(0 == ret_in){
break;
}
}
//printf("******gpio should is low: %d.******\n", ret_in);
if(0 != ret_in){
ret_in=-1;
printf("get low failed! \n");
goto exit;
}
exit:
gpio_register_set_value(port_out, 0);
//gpio_register_set_direction(port_out, 0);
return ret_in;
}
static int gpio_test_init_test_gpio_mode(void )
{
const int test_gpio_1[] = {
40, 33, 34, 39, 99, 10, 11, 88, 87, 86, 85, 84, 89,
56, 55, 58, 57, 48, 59, 10, 90, 20, 53, 19, 46, 127,
49, 50, 32, 31, 6, 7
};
const int test_gpio_0[] = {
8, 27, 28, 26, 25, 15, 1, 3, 0,
37, 38,35, 36, 42, 41, 21, 22, 24, 23,
54, 125, 18, 13, 14, 17, 16, 5, 4, 2, 12,
43, 44, 45, 47, 117, 119
};
int i, j, ret_0, ret_1, total_1, total_0, n = 0;
total_0 = (sizeof(test_gpio_0)/sizeof(int));
total_1 = (sizeof(test_gpio_1)/sizeof(int));
//system("at at+gpsinit=0");
system("i2cset -y -f 2 0x32 0x0d 0x00");
system("i2cset -y -f 2 0x31 0x18 0x8f");
usleep(10000);
//printf("[init]gpio_test_init_test_gpio_mode FINISH\n");
/* [1 all gpio set to low] */
for(j = 0; j < 6 ; j++){
for(i = 0; i < total_0; i++){
gpio_register_set_func_0(test_gpio_0[i]);
gpio_register_set_direction(test_gpio_0[i], 1);
gpio_register_set_value(test_gpio_0[i], 0);
}
for(i = 0; i < total_1; i++){
gpio_register_set_func_0(test_gpio_1[i]);
gpio_register_set_direction(test_gpio_1[i], 1);
gpio_register_set_value(test_gpio_1[i], 0);
}
usleep(50000);
for(i = 0; i <= 10; i++){
ret_0 = mbtk_gpio_adc(0);
usleep(3000);
ret_1 = mbtk_gpio_adc(1);
if(ret_0 ==0 && ret_1 == 0){
break;
}
}
printf("pre set ADC0: %d, ADC1: %d, times: %d\n", ret_0, ret_1, j);
if(ret_0 ==0 && ret_1 == 0){
break;
}
}
if(!(ret_0 ==0 && ret_1 == 0)){
printf("Fail, please retest");
return -1;
}
gpio_register_set_value(119, 1);
gpio_register_set_value(117, 1);
return 0;
}
int mbtk_at_gpio(bool gnss_support, void* arg)
{
const int test_gpio_0[] = {
35, 93,
36, 94,
42, 97,
41, 98,
21, 100,
22, 101,
24, 102,
23, 103,
54, 107,
125, 108,
18, 109,
13, 114,
14, 115,
17, 116,
16, 117,
5, 119,
4, 127,
2, 120,
12, 126,
0, 90,
27, 73,
28, 74,
26, 75,
25, 76,
15, 86,
1, 88,
3, 89,
37, 91,
38, 92,
8, 72
};
const int test_gpio_1[] = {
40, 6,
33, 7,
34, 8,
39, 9,
99, 16,
56, 27,
58, 29,
55, 28,
57, 30,
48, 31,
59, 32,
20, 49,
53, 50,
19, 51,
49, 55,
50, 56,
32, 66,
31, 67,
6, 68,
11, 83,
10, 84,
7, 69,
90, 48,
46, 52,
127, 54,
88, 21,
87, 22,
86, 23,
85, 24,
84, 25,
89, 26,
};
const int test_gpio_2[] = { //GPS组
43, 53,
47, 95,
45, 71,
44, 70,
};
int i, j, ret_0, ret_1, ret_2, total_1, total_0, total_2, n = 0;
int *fail_io = (int *)arg;
total_0 = (sizeof(test_gpio_0)/sizeof(int)); //GPIO+PIN
total_1 = (sizeof(test_gpio_1)/sizeof(int));
total_2 = (sizeof(test_gpio_2)/sizeof(int));
if(gnss_support == 1){
total_2 = total_2 - 4;
}
printf("L508-X6 Start test gpio V1.1\n");
/* [1 all gpio Init] */
gpio_test_init_test_gpio_mode();
/* [2 GPIOTEST] */
//Test 0
for(i = 0; i < total_0; i=i+2){
ret_0 = gpio_register_test_out_0(test_gpio_0[i]);
if(-1 == ret_0){
printf("!!!!!!!!!!!!gpio [%d] test failed!!!!!!!!!!!!\n", test_gpio_0[i]);
fail_io[n] = test_gpio_0[i+1];
n++;
}else{
//printf("############gpio [%d] test success############\n", test_gpio_0[i]);
}
}
//Test 1
for(i = 0; i < total_1; i=i+2){
ret_1 = gpio_register_test_out_1(test_gpio_1[i]);
if(-1 == ret_1){
printf("!!!!!!!!!!!!gpio [%d] test failed!!!!!!!!!!!!\n", test_gpio_1[i]);
fail_io[n] = test_gpio_1[i+1];
n++;
}else{
//printf("############gpio [%d] test success############\n", test_gpio_1[i]);
}
}
//Test 2
for(i = 0; i < total_2; i=i+4){
ret_2 = gpio_register_test_out_2(test_gpio_2[i], test_gpio_2[i+2]);
if(-1 == ret_2){
printf("!!!!!!!!!!!!gpio [%d] test failed!!!!!!!!!!!!\n", test_gpio_2[i+2]);
fail_io[n] = test_gpio_2[i+3];
n++;
}else{
//printf("############gpio [%d] test success############\n", test_gpio_2[i+2]);
}
}
mbtk_adc_close();
return n;
}
#elif 0//(MBTK_PROJECT_T108)
int gpio_register_test_out(int port, int value)
{
int ret;
int i;
int valueh = 0;
int valuel = 1;
//printf("Gpio port [%d] test start!\n", port);
ret = gpio_register_set_func_0(port); //设功能为GPIO
if(ret){
printf("gpio_port can't support!\n");
return -1;
}
gpio_register_set_direction(port, 1); //设方向为输出
//ret = gpio_register_get_value(port);
//printf("gpio default value is: %d\n", ret);
//[High]
for(i = 0; i <= 9; i++){
gpio_register_set_value(port, 1);
usleep(50);
//valueh = gpio_register_get_value(port);
//printf("set high? %d\n", valueh);
if(1 == valueh){
break;
}
}
for(i = 0; i <= 35; i++){
ret = gpio_register_get_value(118);
if(1 == ret){
break;
}
usleep(3000);
}
printf("******gpio should is high: %d.******\n", ret);
if(1 != ret){
ret=-1;
goto exit;
}
//[Low]
usleep(200);
for(i = 0; i <= 9; i++){
gpio_register_set_value(port, 0); //输出低
usleep(50);
//valuel = gpio_register_get_value(port);
//printf("set low? %d\n", valuel);
if(0 == valuel){
break;
}
}
for(i = 0; i <= 35; i++){
ret = gpio_register_get_value(118);
if(0 == ret){
break;
}
usleep(3000);
}
//printf("******gpio should is low: %d.******\n", ret);
if(0 != ret){
ret=-1;
goto exit;
}
exit:
gpio_register_set_value(port, 0);
gpio_register_set_direction(port, 0); //设方向为输入
return ret;
}
int gpio_test_init_test_gpio_mode(void)
{
const int test_gpio[] = {
99,
117,
21,22,23,24,44,41,120,
8,127,46,59,58,57,56,55,48,19,34,33,35,36,49,
50,25,28,26,122,20,10,11,
39,40,37,38,
51,52,31,32,
};
int i, j, ret, total, n = 0;
total = (sizeof(test_gpio)/sizeof(int));
printf("[init]gpio_test_init_test_gpio_mode BEGIN\n");
/* [1 all gpio set to low] */
gpio_register_set_func_0(118);
gpio_register_set_direction(118, 0);
system("echo in > /sys/class/gpio/gpio118/direction");
for(j = 0; j < 6 ; j++){
for(i = 0; i < total; i++){
gpio_register_set_func_0(test_gpio[i]);
gpio_register_set_direction(test_gpio[i], 1);
gpio_register_set_value(test_gpio[i], 0);
//ret = gpio_register_get_value(test_gpio[i]);
//printf("[init]get gpio%d=%d\n", test_gpio[i], ret);
}
for(i = 0; i <= 35; i++){
ret = gpio_register_get_value(118);
printf("[init]get gpi118=%d\n", ret);
usleep(3000);
if(0 == (ret)){
break;
}
}
printf("pre set ADC: %d, times: %d\n",(ret), j);
if(0 == (ret)){
break;
}
}
if(0 != (ret)){
printf("!!!Set all low FAIL, please retest\n");
return -1;
}
return 0;
}
int mbtk_at_gpio(bool gnss_support, void* arg)
{
const int test_gpio[] = {
//GPIO PIN GPIO PIN GPIO PIN GPIO PIN
99, 170, 117, 59, 21, 61, 22, 62,
23, 144, 24, 147, 44, 5, 41, 159,
120, 143, 8, 171, 127, 160, 46, 149,
59, 19, 58, 18, 57, 20, 56, 21,
55, 22, 48, 23, 19, 3, 34, 79,
33, 80, 35, 78, 36, 77, 49, 43,
50, 42, 25, 67, 28, 66, 26, 65,
122, 169, 20, 152, 10, 74, 11, 73,
39, 166, 40, 164, 37, 165, 38, 163,
51, 58, 52, 60, 31, 57, 32, 56,
};
int i, n = 0, ret, total;
int *fail_io = (int *)arg;
int try_count = 0;
total = (sizeof(test_gpio)/sizeof(int));
printf("T108 Start test gpio V1.0, total gpio=%d\n", (total/2));
for(try_count; try_count < 4; try_count++){
n = 0;
/* [1 all gpio Init] */
gpio_test_init_test_gpio_mode();
/* [2 GPIOTEST] */
for(i = 0; i < total; i = i + 2){
ret = gpio_register_test_out(test_gpio[i], 0);
if(-1 == ret){
n++;
printf("!!!!!!!!!!!!gpio [%d] test failed!!!!!!!!!!!!\n", test_gpio[i]);
if(try_count != 3){
printf(" ---TEST FAILED! RETRY!--- \n");
usleep(5000);
break;
}
fail_io[n - 1] = test_gpio[i+1];
}else{
//printf("############gpio [%d] test success############\n", test_gpio[i]);
}
}
if(0 == n){
break;
}
}
return n;
}
#elif (MBTK_PROJECT_T108)
static int gpio_test(int port)
{
int ret;
int i;
int valueh = 0;
int valuel = 1;
//printf("Gpio port [%d] test start!\n", port);
ret = gpio_register_set_func_0(port);
if(ret){
printf("gpio_port can't support!\n");
return -1;
}
gpio_register_set_direction(port, 1);
//ret = gpio_register_get_value(port);
//printf("gpio default value is: %d\n", ret);
//[High]
for(i = 0; i <= 5; i++){
gpio_register_set_value(port, 1);
usleep(50);
//valueh = gpio_register_get_value(port);
//printf("set high? %d\n", valueh);
if(1 == valueh){
break;
}
}
for(i = 0; i <= 5; i++){
ret = gpio_register_get_value(118);
if(1 == ret){
break;
}
usleep(3000);
}
//printf("count=%d \n", i);
//printf("******gpio should is high: %d.******\n", ret);
if(1 != ret){
ret=-1;
goto exit;
}
//[Low]
usleep(200);
for(i = 0; i <= 9; i++){
gpio_register_set_value(port, 0);
usleep(50);
//valuel = gpio_register_get_value(port);
//printf("set low? %d\n", valuel);
if(0 == valuel){
break;
}
}
for(i = 0; i <= 5; i++){
ret = gpio_register_get_value(118);
if(0 == ret){
break;
}
usleep(3000);
}
//printf("count=%d \n", i);
//printf("******gpio should is low: %d.******\n", ret);
if(0 != ret){
ret=-1;
goto exit;
}
exit:
gpio_register_set_value(port, 0);
gpio_register_set_direction(port, 0);
return ret;
}
static int gpio_test_init_test_gpio_mode(void)
{
const int test_gpio[] = {
99,8,117,21,22,23,24,41,120,19,123,
58,59,57,56,55,48,125,127,36,35,34,
33,54,47,53,46,50,49,11,10,26,28,25,
27,32,31,51,52,39,40,37,38,
44,45
};
int i, j, ret, total, n = 0;
total = (sizeof(test_gpio)/sizeof(int));
//printf("[init]gpio_test_init_test_gpio_mode BEGIN\n");
/* [1 all gpio set to low] */
gpio_register_set_func_0(118);
gpio_register_set_direction(118, 0);
for(j = 0; j < 5 ; j++){
for(i = 0; i < total; i++){
gpio_register_set_func_0(test_gpio[i]);
gpio_register_set_direction(test_gpio[i], 1);
gpio_register_set_value(test_gpio[i], 0);
//ret = gpio_register_get_value(test_gpio[i]);
//printf("[init]get gpio%d=%d\n", test_gpio[i], ret);
}
for(i = 0; i <= 10; i++){
ret = gpio_register_get_value(118);
//printf("[init]get gpi118=%d\n", ret);
usleep(3000);
if(0 == (ret)){
break;
}
}
//printf("pre set 118: %d, times: %d\n",(ret), j);
if(0 == (ret)){
break;
}
}
if(0 != (ret)){
printf("!!!Set all low FAIL, please retest\n");
return -1;
}
return 0;
}
int mbtk_at_gpio(bool gnss_support, void* arg)
{
const int test_gpio[] = {
//GPIO PIN GPIO PIN GPIO PIN GPIO PIN
99, 170, 8, 171, 117, 59, 21, 61,
22, 62, 23, 144, 24, 147, 41, 159,
120, 143, 19, 3, 123, 5, 58, 18,
59, 19, 57, 20, 56, 21, 55, 22,
48, 23, 125, 149, 127, 160, 36, 77,
35, 78, 34, 79, 33, 80, 54, 163,
#if 0 //Hard Ware ERROR!
47, 164,
46, 166,
#endif
53, 165, 50, 42, 49, 43, 11, 73,
10, 74, 26, 65, 28, 66, 25, 67,
27, 68, 32, 56, 31, 57, 51, 58,
52, 60, 39, 192, 40, 193, 37, 194,
38, 195,
#if 0 //undefine GNSS
44, 161,
45, 151,
#endif
};
int i, n = 0, ret, total;
int *fail_io = (int *)arg;
int try_count;
total = (sizeof(test_gpio)/sizeof(int));
printf("T108 V2 Start test gpio V0.8, total gpio=%d\n", (total/2));
for(try_count = 0; try_count < 4; try_count++){
n = 0;
/* [1 all gpio Init] */
gpio_test_init_test_gpio_mode();
/* [2 GPIOTEST] */
for(i = 0; i < total; i = i + 2){
ret = gpio_test(test_gpio[i]);
if(-1 == ret){
n++;
printf("!!!!!!!!!!!!gpio [%d] test failed!!!!!!!!!!!!\n", test_gpio[i]);
if(try_count != 3){
printf(" ---TEST FAILED! RETRY!--- \n");
usleep(5000);
break;
}
fail_io[n - 1] = test_gpio[i + 1];
}else{
//printf("############gpio [%d] test success############\n", test_gpio[i]);
}
}
if(0 == n){
printf(" ---ALL PASS---\n");
break;
}
}
return n;
}
#else
int mbtk_at_gpio(bool gnss_support, void* arg)
{
return -1;
}
#endif