improve air724 driver
This commit is contained in:
@@ -7,27 +7,75 @@
|
|||||||
#include <stdbool.h>
|
#include <stdbool.h>
|
||||||
#include <ctype.h>
|
#include <ctype.h>
|
||||||
|
|
||||||
static int air724_echo_close(void)
|
typedef struct ip_addr_st {
|
||||||
|
uint8_t seg1;
|
||||||
|
uint8_t seg2;
|
||||||
|
uint8_t seg3;
|
||||||
|
uint8_t seg4;
|
||||||
|
}ip_addr_t;
|
||||||
|
|
||||||
|
static ip_addr_t domain_parser_addr = {0};
|
||||||
|
static k_sem_t domain_parser_sem;
|
||||||
|
|
||||||
|
static int air724_power_on(void)
|
||||||
|
{
|
||||||
|
#if AIR724_USE_PWRKEY_GPIO
|
||||||
|
HAL_GPIO_WritePin(AIR724_PWR_GPIO_PORT, AIR724_PWR_GPIO_PIN, GPIO_PIN_RESET);
|
||||||
|
tos_sleep_ms(1000);
|
||||||
|
HAL_GPIO_WritePin(AIR724_PWR_GPIO_PORT, AIR724_PWR_GPIO_PIN, GPIO_PIN_SET);
|
||||||
|
#else
|
||||||
|
tos_sleep_ms(1000);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int air724_check_ready(void)
|
||||||
{
|
{
|
||||||
at_echo_t echo;
|
at_echo_t echo;
|
||||||
|
int try = 0;
|
||||||
|
|
||||||
tos_at_echo_create(&echo, NULL, 0, NULL);
|
tos_at_echo_create(&echo, NULL, 0, NULL);
|
||||||
tos_at_cmd_exec(&echo, 300, "ATE0\r\n");
|
while (try++ < 10) {
|
||||||
if (echo.status == AT_ECHO_STATUS_OK)
|
tos_at_cmd_exec(&echo, 1000, "AT\r\n");
|
||||||
{
|
if (echo.status == AT_ECHO_STATUS_OK) {
|
||||||
return 0;
|
return 0;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static int air724_echo_close(void)
|
||||||
|
{
|
||||||
|
at_echo_t echo;
|
||||||
|
int try = 0;
|
||||||
|
|
||||||
|
tos_at_echo_create(&echo, NULL, 0, NULL);
|
||||||
|
|
||||||
|
while(try++ < 10) {
|
||||||
|
tos_at_cmd_exec(&echo, 300, "ATE0\r\n");
|
||||||
|
if (echo.status == AT_ECHO_STATUS_OK)
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
static int air724_cscon_close(void)
|
static int air724_cscon_close(void)
|
||||||
{
|
{
|
||||||
at_echo_t echo;
|
at_echo_t echo;
|
||||||
|
int try = 0;
|
||||||
|
|
||||||
tos_at_echo_create(&echo, NULL, 0, NULL);
|
tos_at_echo_create(&echo, NULL, 0, NULL);
|
||||||
tos_at_cmd_exec(&echo, 300, "AT+CSCON=0\r\n");
|
while (try++ < 10) {
|
||||||
if (echo.status == AT_ECHO_STATUS_OK)
|
tos_at_cmd_exec(&echo, 300, "AT+CSCON=0\r\n");
|
||||||
{
|
if (echo.status == AT_ECHO_STATUS_OK)
|
||||||
return 0;
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
tos_sleep_ms(1000);
|
||||||
}
|
}
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
@@ -49,6 +97,8 @@ static int air724_sim_card_check(void)
|
|||||||
{
|
{
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
tos_sleep_ms(1000);
|
||||||
}
|
}
|
||||||
|
|
||||||
return -1;
|
return -1;
|
||||||
@@ -79,6 +129,8 @@ static int air724_signal_quality_check(void)
|
|||||||
if (rssi != 99) {
|
if (rssi != 99) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
tos_sleep_ms(2000);
|
||||||
}
|
}
|
||||||
|
|
||||||
return -1;
|
return -1;
|
||||||
@@ -109,6 +161,8 @@ static int air724_gsm_network_check(void)
|
|||||||
{
|
{
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
tos_sleep_ms(1000);
|
||||||
}
|
}
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
@@ -139,6 +193,8 @@ static int air724_gprs_network_check(void)
|
|||||||
{
|
{
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
tos_sleep_ms(1000);
|
||||||
}
|
}
|
||||||
|
|
||||||
return -1;
|
return -1;
|
||||||
@@ -156,6 +212,8 @@ static int air724_close_apn(void)
|
|||||||
{
|
{
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
tos_sleep_ms(2000);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@@ -209,13 +267,14 @@ static int air724_set_apn(void)
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
tos_at_echo_create(&echo, NULL, 0, NULL);
|
||||||
tos_at_cmd_exec(&echo, 3000, "AT+CIICR\r\n");
|
tos_at_cmd_exec(&echo, 50000, "AT+CIICR\r\n");
|
||||||
if (echo.status != AT_ECHO_STATUS_OK)
|
if (echo.status != AT_ECHO_STATUS_OK)
|
||||||
{
|
{
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
tos_at_echo_create(&echo, NULL, 0, NULL);
|
||||||
tos_at_cmd_exec(&echo, 300, "AT+CIFSR\r\n");
|
tos_at_cmd_exec(&echo, 300, "AT+CIFSR\r\n");
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
@@ -226,6 +285,15 @@ static int air724_set_apn(void)
|
|||||||
static int air724_init(void)
|
static int air724_init(void)
|
||||||
{
|
{
|
||||||
printf("Init air724 ...\n" );
|
printf("Init air724 ...\n" );
|
||||||
|
|
||||||
|
air724_power_on();
|
||||||
|
tos_sleep_ms(2000);
|
||||||
|
printf("module power on\n");
|
||||||
|
|
||||||
|
if (air724_check_ready() != 0) {
|
||||||
|
printf("wait module ready timeout, please check your module\n");
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
if (air724_echo_close() != 0)
|
if (air724_echo_close() != 0)
|
||||||
{
|
{
|
||||||
@@ -322,10 +390,12 @@ static int air724_connect(const char *ip, const char *port, sal_proto_t proto)
|
|||||||
return id;
|
return id;
|
||||||
}
|
}
|
||||||
#else
|
#else
|
||||||
tos_at_echo_create(&echo, NULL, 0, "CONNECT OK");
|
char result[20];
|
||||||
tos_at_cmd_exec(&echo, 4000, "AT+CIPSTART=%d,%s,%s,%d\r\n",
|
sprintf(result, "%d, CONNECT OK", id);
|
||||||
|
tos_at_echo_create(&echo, NULL, 0, result);
|
||||||
|
tos_at_cmd_exec_until(&echo, 8000, "AT+CIPSTART=%d,%s,%s,%d\r\n",
|
||||||
id, proto == TOS_SAL_PROTO_UDP ? "UDP" : "TCP", ip, atoi(port));
|
id, proto == TOS_SAL_PROTO_UDP ? "UDP" : "TCP", ip, atoi(port));
|
||||||
if (echo.status == AT_ECHO_STATUS_OK) {
|
if (echo.status == AT_ECHO_STATUS_EXPECT) {
|
||||||
return id;
|
return id;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
@@ -458,41 +528,23 @@ static int air724_close(int id)
|
|||||||
|
|
||||||
static int air724_parse_domain(const char *host_name, char *host_ip, size_t host_ip_len)
|
static int air724_parse_domain(const char *host_name, char *host_ip, size_t host_ip_len)
|
||||||
{
|
{
|
||||||
char *str;
|
|
||||||
at_echo_t echo;
|
at_echo_t echo;
|
||||||
char echo_buffer[128];
|
|
||||||
|
|
||||||
tos_at_echo_create(&echo, echo_buffer, sizeof(echo_buffer), "+CDNSGIP:");
|
|
||||||
tos_at_cmd_exec(&echo, 8000, "AT+CDNSGIP=\"%s\"\r\n", host_name);
|
|
||||||
|
|
||||||
if (echo.status != AT_ECHO_STATUS_OK && echo.status != AT_ECHO_STATUS_EXPECT)
|
|
||||||
{
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
+CDNSGIP: 1,"domain","xxx.xxx.xxx.xxx"
|
|
||||||
*/
|
|
||||||
|
|
||||||
str = strstr(echo.buffer, ":");
|
tos_sem_create_max(&domain_parser_sem, 0, 1);
|
||||||
if (!str)
|
|
||||||
|
tos_at_echo_create(&echo, NULL, 0, NULL);
|
||||||
|
tos_at_cmd_exec(&echo, 1000, "AT+CDNSGIP=\"%s\"\r\n", host_name);
|
||||||
|
|
||||||
|
if (echo.status != AT_ECHO_STATUS_OK)
|
||||||
{
|
{
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
str += 1;
|
|
||||||
if(*str == '0')
|
|
||||||
{
|
|
||||||
/* parse fail */
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
str += strlen(host_name) + 7;
|
tos_sem_pend(&domain_parser_sem, TOS_TIME_FOREVER);
|
||||||
|
|
||||||
int seg1, seg2, seg3, seg4;
|
snprintf(host_ip, host_ip_len, "%d.%d.%d.%d", domain_parser_addr.seg1, domain_parser_addr.seg2, domain_parser_addr.seg3, domain_parser_addr.seg4);
|
||||||
sscanf(str, "%d.%d.%d.%d", &seg1, &seg2, &seg3, &seg4);
|
|
||||||
snprintf(host_ip, host_ip_len, "%d.%d.%d.%d", seg1, seg2, seg3, seg4);
|
|
||||||
host_ip[host_ip_len - 1] = '\0';
|
host_ip[host_ip_len - 1] = '\0';
|
||||||
|
|
||||||
printf("GOT IP: %s\n", host_ip);
|
printf("GOT IP: %s\n", host_ip);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
@@ -574,8 +626,100 @@ __STATIC__ void air724_incoming_data_process(void)
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
__STATIC__ void air724_domain_data_process(void)
|
||||||
|
{
|
||||||
|
uint8_t data;
|
||||||
|
int retcode = 0;
|
||||||
|
|
||||||
|
/*
|
||||||
|
+CDNSGIP: 1,"domain","xxx.xxx.xxx.xxx"
|
||||||
|
*/
|
||||||
|
|
||||||
|
if (tos_at_uart_read(&data, 1) != 1) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
while (1)
|
||||||
|
{
|
||||||
|
if (tos_at_uart_read(&data, 1) != 1)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (data == ',')
|
||||||
|
{
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
retcode = retcode * 10 + (data - '0');
|
||||||
|
}
|
||||||
|
|
||||||
|
if (retcode != 1) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
while (1)
|
||||||
|
{
|
||||||
|
if (tos_at_uart_read(&data, 1) != 1)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (data == ',')
|
||||||
|
{
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (tos_at_uart_read(&data, 1) != 1) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* start parser domain */
|
||||||
|
while (1) {
|
||||||
|
if (tos_at_uart_read(&data, 1) != 1) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (data == '.') {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
domain_parser_addr.seg1 = domain_parser_addr.seg1 *10 + (data-'0');
|
||||||
|
}
|
||||||
|
while (1) {
|
||||||
|
if (tos_at_uart_read(&data, 1) != 1) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (data == '.') {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
domain_parser_addr.seg2 = domain_parser_addr.seg2 *10 + (data-'0');
|
||||||
|
}
|
||||||
|
while (1) {
|
||||||
|
if (tos_at_uart_read(&data, 1) != 1) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (data == '.') {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
domain_parser_addr.seg3 = domain_parser_addr.seg3 *10 + (data-'0');
|
||||||
|
}
|
||||||
|
while (1) {
|
||||||
|
if (tos_at_uart_read(&data, 1) != 1) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (data == '\"') {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
domain_parser_addr.seg4 = domain_parser_addr.seg4 *10 + (data-'0');
|
||||||
|
}
|
||||||
|
tos_sem_post(&domain_parser_sem);
|
||||||
|
return;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
at_event_t air724_at_event[] = {
|
at_event_t air724_at_event[] = {
|
||||||
{ "+RECEIVE,", air724_incoming_data_process},
|
{ "+RECEIVE,", air724_incoming_data_process},
|
||||||
|
{ "+CDNSGIP:", air724_domain_data_process},
|
||||||
};
|
};
|
||||||
|
|
||||||
sal_module_t sal_module_air724 = {
|
sal_module_t sal_module_air724 = {
|
||||||
|
@@ -30,6 +30,11 @@ typedef enum air724_multilink_state {
|
|||||||
AIR724_MULTILINK_STATE_DISABLE,
|
AIR724_MULTILINK_STATE_DISABLE,
|
||||||
} air724_multilink_state_t;
|
} air724_multilink_state_t;
|
||||||
|
|
||||||
|
/* PWRKEY GPIO */
|
||||||
|
#define AIR724_USE_PWRKEY_GPIO 0
|
||||||
|
#define AIR724_PWR_GPIO_PORT GPIOB
|
||||||
|
#define AIR724_PWR_GPIO_PIN GPIO_PIN_5
|
||||||
|
|
||||||
int air724_sal_init(hal_uart_port_t uart_port);
|
int air724_sal_init(hal_uart_port_t uart_port);
|
||||||
|
|
||||||
#endif /* __AIR724_H__ */
|
#endif /* __AIR724_H__ */
|
||||||
|
Reference in New Issue
Block a user