3938 lines
133 KiB
C
Executable File
3938 lines
133 KiB
C
Executable File
/*
|
||
* (C) Copyright 2007-2013
|
||
* Allwinner Technology Co., Ltd. <www.allwinnertech.com>
|
||
* Jerry Wang <wangflord@allwinnertech.com>
|
||
*
|
||
* See file CREDITS for list of people who contributed to this
|
||
* project.
|
||
*
|
||
* This program is free software; you can redistribute it and/or
|
||
* modify it under the terms of the GNU General Public License as
|
||
* published by the Free Software Foundation; either version 2 of
|
||
* the License, or (at your option) any later version.
|
||
*
|
||
* This program is distributed in the hope that it will be useful,
|
||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||
* GNU General Public License for more details.
|
||
*
|
||
* You should have received a copy of the GNU General Public License
|
||
* along with this program; if not, write to the Free Software
|
||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston,
|
||
* MA 02111-1307 USA
|
||
*/
|
||
#include <common.h>
|
||
#include <malloc.h>
|
||
#include <asm/io.h>
|
||
#include <asm/arch/platform.h>
|
||
#include <asm/arch/cpu.h>
|
||
#include <sys_config.h>
|
||
#include <smc.h>
|
||
#include <pmu.h>
|
||
|
||
DECLARE_GLOBAL_DATA_PTR;
|
||
|
||
static script_sub_key_t *sw_cfg_get_subkey(const char *script_buf, const char *main_key, const char *sub_key)
|
||
{
|
||
script_head_t *hd = (script_head_t *)script_buf;
|
||
script_main_key_t *mk = (script_main_key_t *)(hd + 1);
|
||
script_sub_key_t *sk = NULL;
|
||
int i, j;
|
||
|
||
for (i = 0; i < hd->main_key_count; i++) {
|
||
|
||
if (strcmp(main_key, mk->main_name)) {
|
||
mk++;
|
||
continue;
|
||
}
|
||
|
||
for (j = 0; j < mk->lenth; j++) {
|
||
sk = (script_sub_key_t *)(script_buf + (mk->offset<<2) + j * sizeof(script_sub_key_t));
|
||
if (!strcmp(sub_key, sk->sub_name)) return sk;
|
||
}
|
||
}
|
||
return NULL;
|
||
}
|
||
|
||
int sw_cfg_get_int(const char *script_buf, const char *main_key, const char *sub_key)
|
||
{
|
||
script_sub_key_t *sk = NULL;
|
||
char *pdata;
|
||
int value;
|
||
|
||
sk = sw_cfg_get_subkey(script_buf, main_key, sub_key);
|
||
if (sk == NULL) {
|
||
return -1;
|
||
}
|
||
|
||
if (((sk->pattern >> 16) & 0xffff) == SCIRPT_PARSER_VALUE_TYPE_SINGLE_WORD) {
|
||
pdata = (char *)(script_buf + (sk->offset<<2));
|
||
value = *((int *)pdata);
|
||
return value;
|
||
}
|
||
|
||
return -1;
|
||
}
|
||
|
||
char *sw_cfg_get_str(const char *script_buf, const char *main_key, const char *sub_key, char *buf)
|
||
{
|
||
script_sub_key_t *sk = NULL;
|
||
char *pdata;
|
||
|
||
sk = sw_cfg_get_subkey(script_buf, main_key, sub_key);
|
||
if (sk == NULL) {
|
||
return NULL;
|
||
}
|
||
|
||
if (((sk->pattern >> 16) & 0xffff) == SCIRPT_PARSER_VALUE_TYPE_STRING) {
|
||
pdata = (char *)(script_buf + (sk->offset<<2));
|
||
memcpy(buf, pdata, ((sk->pattern >> 0) & 0xffff));
|
||
return (char *)buf;
|
||
}
|
||
|
||
return NULL;
|
||
}
|
||
|
||
/*
|
||
************************************************************************************************************
|
||
*
|
||
* function
|
||
*
|
||
* name :
|
||
*
|
||
* parmeters :
|
||
*
|
||
* return :
|
||
*
|
||
* note :
|
||
*
|
||
*
|
||
************************************************************************************************************
|
||
*/
|
||
//static int gpio_probe_axpgpio_value(int port_num)
|
||
//{
|
||
// char pmu_name[16];
|
||
// if((port_num == 0) || (port_num == 1))
|
||
// {
|
||
// if(axp_probe_supply_pmu_name(pmu_name))
|
||
// {
|
||
// return -1;
|
||
// }
|
||
//
|
||
// if(port_num == 0)
|
||
// {
|
||
// return axp_probe_supply_status_byname(pmu_name, "power0");
|
||
// }
|
||
// else if(port_num == 1)
|
||
// {
|
||
// return axp_probe_supply_status_byname(pmu_name, "power1");
|
||
// }
|
||
// }
|
||
//
|
||
// return -1;
|
||
//}
|
||
|
||
/**########################################################################################
|
||
*
|
||
* Script Operations
|
||
*
|
||
-#########################################################################################*/
|
||
//static char *script_mod_buf = (char *)(4); //pointer to first key
|
||
//static int script_main_key_count = -1;
|
||
|
||
static int _test_str_length(char *str)
|
||
{
|
||
int length = 0;
|
||
|
||
while(str[length++])
|
||
{
|
||
if(length > 32)
|
||
{
|
||
length = 32;
|
||
break;
|
||
}
|
||
}
|
||
|
||
return length;
|
||
}
|
||
|
||
int script_parser_init(char *script_buf)
|
||
{
|
||
script_head_t *script_head;
|
||
|
||
if(script_buf)
|
||
{
|
||
gd->script_mod_buf = script_buf;
|
||
script_head = (script_head_t *)script_buf;
|
||
|
||
gd->script_main_key_count = script_head->main_key_count;
|
||
|
||
return SCRIPT_PARSER_OK;
|
||
}
|
||
else
|
||
{
|
||
return SCRIPT_PARSER_EMPTY_BUFFER;
|
||
}
|
||
}
|
||
#ifdef CONFIG_SMALL_MEMSIZE
|
||
void save_config(void)
|
||
{
|
||
script_head_t *script_head;
|
||
uint script_length = 0;
|
||
|
||
script_head = (script_head_t *)gd->script_mod_buf;
|
||
script_length = script_head->length;
|
||
if(script_length)
|
||
{
|
||
printf("save config for small mem_size \n");
|
||
gd->script_mod_buf = (char *)malloc(script_length * sizeof(char));
|
||
if(!gd->script_mod_buf)
|
||
{
|
||
printf("do not have enough memory to save config \n");
|
||
return ;
|
||
}
|
||
memcpy((void *)gd->script_mod_buf,(void *)script_head ,script_length);
|
||
}
|
||
return ;
|
||
}
|
||
|
||
|
||
void reload_config(void)
|
||
{
|
||
script_head_t *script_head;
|
||
uint script_length = 0;
|
||
|
||
script_head = (script_head_t *)gd->script_mod_buf;
|
||
script_length = script_head->length;
|
||
if(script_length)
|
||
{
|
||
printf("reload config to 0x%x\n", SYS_CONFIG_MEMBASE);
|
||
memcpy((void*)SYS_CONFIG_MEMBASE,(void*)script_head ,script_length);
|
||
}
|
||
return ;
|
||
}
|
||
#endif
|
||
unsigned script_get_length(void)
|
||
{
|
||
script_head_t *orign_head = (script_head_t *)gd->script_mod_buf;
|
||
|
||
return orign_head->length;
|
||
}
|
||
|
||
int script_parser_exit(void)
|
||
{
|
||
gd->script_mod_buf = NULL;
|
||
gd->script_main_key_count = 0;
|
||
|
||
return SCRIPT_PARSER_OK;
|
||
}
|
||
|
||
uint script_parser_subkey( script_main_key_t* main_name,char *subkey_name , uint *pattern)
|
||
{
|
||
script_main_key_t *main_key = NULL;
|
||
script_sub_key_t *sub_key = NULL;
|
||
int i = 0;
|
||
|
||
if((!gd->script_mod_buf)||(gd->script_main_key_count<=0))
|
||
{
|
||
return 0;
|
||
}
|
||
if((main_name == NULL)||(subkey_name == NULL))
|
||
{
|
||
printf("main_name is invalid \n");
|
||
return 0;
|
||
}
|
||
|
||
main_key = main_name;
|
||
for(i = 0;i<main_key->lenth;i++)
|
||
{
|
||
sub_key = (script_sub_key_t *)(gd->script_mod_buf + (main_key->offset<<2) + (i * sizeof(script_sub_key_t)));
|
||
if(strcmp(sub_key->sub_name,subkey_name))
|
||
continue;
|
||
*pattern = (sub_key->pattern>>16)&0xffff;
|
||
return (uint)sub_key;
|
||
}
|
||
return 0;
|
||
}
|
||
|
||
uint script_parser_fetch_subkey_start(char *main_name)
|
||
{
|
||
char main_bkname[32];
|
||
char *main_char;
|
||
script_main_key_t *main_key = NULL;
|
||
int i;
|
||
/* check params */
|
||
if((!gd->script_mod_buf) || (gd->script_main_key_count <= 0))
|
||
{
|
||
return 0;
|
||
}
|
||
|
||
if(main_name == NULL)
|
||
{
|
||
return 0;
|
||
}
|
||
|
||
/* truncate string if size >31 bytes */
|
||
main_char = main_name;
|
||
if(_test_str_length(main_name) > 31)
|
||
{
|
||
memset(main_bkname, 0, 32);
|
||
strncpy(main_bkname, main_name, 31);
|
||
main_char = main_bkname;
|
||
}
|
||
|
||
for(i=0;i<gd->script_main_key_count;i++)
|
||
{
|
||
main_key = (script_main_key_t *)(gd->script_mod_buf + (sizeof(script_head_t)) + i * sizeof(script_main_key_t));
|
||
if(strcmp(main_key->main_name, main_char))
|
||
{
|
||
continue;
|
||
}
|
||
|
||
return (uint)main_key;
|
||
}
|
||
|
||
return 0;
|
||
}
|
||
|
||
|
||
int script_parser_fetch_subkey_next(uint hd, char *sub_name, int value[], int *index)
|
||
{
|
||
script_main_key_t *main_key;
|
||
script_sub_key_t *sub_key = NULL;
|
||
int j;
|
||
int pattern;
|
||
|
||
if(!hd)
|
||
{
|
||
return -1;
|
||
}
|
||
|
||
main_key = (script_main_key_t *)hd;
|
||
/* now find sub key */
|
||
for(j = *index; j < main_key->lenth; j++)
|
||
{
|
||
sub_key = (script_sub_key_t *)(gd->script_mod_buf + (main_key->offset<<2) + (j * sizeof(script_sub_key_t)));
|
||
|
||
pattern = (sub_key->pattern>>16) & 0xffff; /* get datatype */
|
||
if(pattern == SCIRPT_PARSER_VALUE_TYPE_SINGLE_WORD)
|
||
{
|
||
value[0] = *(int *)(gd->script_mod_buf + (sub_key->offset<<2));
|
||
strcpy(sub_name, sub_key->sub_name);
|
||
|
||
*index = j + 1;
|
||
|
||
return SCRIPT_PARSER_OK;
|
||
}
|
||
else if(pattern == SCIRPT_PARSER_VALUE_TYPE_STRING)
|
||
{
|
||
strcpy((void *)value, gd->script_mod_buf + (sub_key->offset<<2));
|
||
strcpy(sub_name, sub_key->sub_name);
|
||
|
||
*index = j + 1;
|
||
|
||
return SCRIPT_PARSER_OK;
|
||
}
|
||
}
|
||
|
||
return SCRIPT_PARSER_KEY_NOT_FIND;
|
||
}
|
||
|
||
int script_parser_fetch(char *main_name, char *sub_name, int value[], int count)
|
||
{
|
||
char main_bkname[32], sub_bkname[32];
|
||
char *main_char, *sub_char;
|
||
script_main_key_t *main_key = NULL;
|
||
script_sub_key_t *sub_key = NULL;
|
||
int i, j;
|
||
int pattern, word_count;
|
||
/* check params */
|
||
if((!gd->script_mod_buf) || (gd->script_main_key_count <= 0))
|
||
{
|
||
return SCRIPT_PARSER_EMPTY_BUFFER;
|
||
}
|
||
|
||
if((main_name == NULL) || (sub_name == NULL))
|
||
{
|
||
return SCRIPT_PARSER_KEYNAME_NULL;
|
||
}
|
||
|
||
if(value == NULL)
|
||
{
|
||
return SCRIPT_PARSER_DATA_VALUE_NULL;
|
||
}
|
||
|
||
/* truncate string if size >31 bytes */
|
||
main_char = main_name;
|
||
if(_test_str_length(main_name) > 31)
|
||
{
|
||
memset(main_bkname, 0, 32);
|
||
strncpy(main_bkname, main_name, 31);
|
||
main_char = main_bkname;
|
||
}
|
||
sub_char = sub_name;
|
||
if(_test_str_length(sub_name) > 31)
|
||
{
|
||
memset(sub_bkname, 0, 32);
|
||
strncpy(sub_bkname, sub_name, 31);
|
||
sub_char = sub_bkname;
|
||
}
|
||
for(i=0;i<gd->script_main_key_count;i++)
|
||
{
|
||
main_key = (script_main_key_t *)(gd->script_mod_buf + (sizeof(script_head_t)) + i * sizeof(script_main_key_t));
|
||
if(strcmp(main_key->main_name, main_char))
|
||
{
|
||
continue;
|
||
}
|
||
|
||
/* now find sub key */
|
||
for(j=0;j<main_key->lenth;j++)
|
||
{
|
||
sub_key = (script_sub_key_t *)(gd->script_mod_buf + (main_key->offset<<2) + (j * sizeof(script_sub_key_t)));
|
||
if(strcmp(sub_key->sub_name, sub_char))
|
||
{
|
||
continue;
|
||
}
|
||
pattern = (sub_key->pattern>>16) & 0xffff; /* get datatype */
|
||
word_count = (sub_key->pattern>> 0) & 0xffff; /*get count of word */
|
||
|
||
switch(pattern)
|
||
{
|
||
case SCIRPT_PARSER_VALUE_TYPE_SINGLE_WORD:
|
||
value[0] = *(int *)(gd->script_mod_buf + (sub_key->offset<<2));
|
||
break;
|
||
|
||
case SCIRPT_PARSER_VALUE_TYPE_STRING:
|
||
if(count < word_count)
|
||
{
|
||
word_count = count;
|
||
}
|
||
memcpy((char *)value, gd->script_mod_buf + (sub_key->offset<<2), word_count << 2);
|
||
break;
|
||
|
||
case SCIRPT_PARSER_VALUE_TYPE_MULTI_WORD:
|
||
break;
|
||
case SCIRPT_PARSER_VALUE_TYPE_GPIO_WORD:
|
||
{
|
||
script_gpio_set_t *user_gpio_cfg = (script_gpio_set_t *)value;
|
||
/* buffer space enough? */
|
||
if(sizeof(script_gpio_set_t) > (count<<2))
|
||
{
|
||
return SCRIPT_PARSER_BUFFER_NOT_ENOUGH;
|
||
}
|
||
strcpy( user_gpio_cfg->gpio_name, sub_char);
|
||
memcpy(&user_gpio_cfg->port, gd->script_mod_buf + (sub_key->offset<<2), sizeof(script_gpio_set_t) - 32);
|
||
break;
|
||
}
|
||
}
|
||
|
||
return SCRIPT_PARSER_OK;
|
||
}
|
||
}
|
||
|
||
return SCRIPT_PARSER_KEY_NOT_FIND;
|
||
}
|
||
|
||
int script_parser_fetch_ex(char *main_name, char *sub_name, int value[], script_parser_value_type_t *type, int count)
|
||
{
|
||
char main_bkname[32], sub_bkname[32];
|
||
char *main_char, *sub_char;
|
||
script_main_key_t *main_key = NULL;
|
||
script_sub_key_t *sub_key = NULL;
|
||
int i, j;
|
||
int pattern, word_count;
|
||
/* check params */
|
||
if((!gd->script_mod_buf) || (gd->script_main_key_count <= 0))
|
||
{
|
||
return SCRIPT_PARSER_EMPTY_BUFFER;
|
||
}
|
||
|
||
if((main_name == NULL) || (sub_name == NULL))
|
||
{
|
||
return SCRIPT_PARSER_KEYNAME_NULL;
|
||
}
|
||
|
||
if(value == NULL)
|
||
{
|
||
return SCRIPT_PARSER_DATA_VALUE_NULL;
|
||
}
|
||
|
||
/* truncate string if size >31 bytes */
|
||
main_char = main_name;
|
||
if(_test_str_length(main_name) > 31)
|
||
{
|
||
memset(main_bkname, 0, 32);
|
||
strncpy(main_bkname, main_name, 31);
|
||
main_char = main_bkname;
|
||
}
|
||
sub_char = sub_name;
|
||
if(_test_str_length(sub_name) > 31)
|
||
{
|
||
memset(sub_bkname, 0, 32);
|
||
strncpy(sub_bkname, sub_name, 31);
|
||
sub_char = sub_bkname;
|
||
}
|
||
for(i=0;i<gd->script_main_key_count;i++)
|
||
{
|
||
main_key = (script_main_key_t *)(gd->script_mod_buf + (sizeof(script_head_t)) + i * sizeof(script_main_key_t));
|
||
if(strcmp(main_key->main_name, main_char))
|
||
{
|
||
continue;
|
||
}
|
||
|
||
/* now find sub key */
|
||
for(j=0;j<main_key->lenth;j++)
|
||
{
|
||
sub_key = (script_sub_key_t *)(gd->script_mod_buf + (main_key->offset<<2) + (j * sizeof(script_sub_key_t)));
|
||
if(strcmp(sub_key->sub_name, sub_char))
|
||
{
|
||
continue;
|
||
}
|
||
pattern = (sub_key->pattern>>16) & 0xffff; /* get datatype */
|
||
word_count = (sub_key->pattern>> 0) & 0xffff; /*get count of word */
|
||
|
||
switch(pattern)
|
||
{
|
||
case SCIRPT_PARSER_VALUE_TYPE_SINGLE_WORD:
|
||
value[0] = *(int *)(gd->script_mod_buf + (sub_key->offset<<2));
|
||
*type = SCIRPT_PARSER_VALUE_TYPE_SINGLE_WORD;
|
||
break;
|
||
|
||
case SCIRPT_PARSER_VALUE_TYPE_STRING:
|
||
if(count < word_count)
|
||
{
|
||
word_count = count;
|
||
}
|
||
memcpy((char *)value, gd->script_mod_buf + (sub_key->offset<<2), word_count << 2);
|
||
*type = SCIRPT_PARSER_VALUE_TYPE_STRING;
|
||
break;
|
||
|
||
case SCIRPT_PARSER_VALUE_TYPE_MULTI_WORD:
|
||
*type = SCIRPT_PARSER_VALUE_TYPE_MULTI_WORD;
|
||
break;
|
||
case SCIRPT_PARSER_VALUE_TYPE_GPIO_WORD:
|
||
{
|
||
script_gpio_set_t *user_gpio_cfg = (script_gpio_set_t *)value;
|
||
/* buffer space enough? */
|
||
if(sizeof(script_gpio_set_t) > (count<<2))
|
||
{
|
||
return SCRIPT_PARSER_BUFFER_NOT_ENOUGH;
|
||
}
|
||
strcpy( user_gpio_cfg->gpio_name, sub_char);
|
||
memcpy(&user_gpio_cfg->port, gd->script_mod_buf + (sub_key->offset<<2), sizeof(script_gpio_set_t) - 32);
|
||
*type = SCIRPT_PARSER_VALUE_TYPE_GPIO_WORD;
|
||
break;
|
||
}
|
||
}
|
||
|
||
return SCRIPT_PARSER_OK;
|
||
}
|
||
}
|
||
|
||
return SCRIPT_PARSER_KEY_NOT_FIND;
|
||
}
|
||
|
||
int script_parser_patch_all(char *main_name, void *str, uint data_count)
|
||
{
|
||
script_main_key_t *main_key = NULL;
|
||
script_sub_key_t *sub_key = NULL;
|
||
int i, j;
|
||
int data_max;
|
||
int pattern;
|
||
uint *data = (uint *)str;
|
||
|
||
//<2F><><EFBFBD><EFBFBD><EFBFBD>ű<EFBFBD>buffer<65>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD><EFBFBD>
|
||
if(!gd->script_mod_buf)
|
||
{
|
||
return SCRIPT_PARSER_EMPTY_BUFFER;
|
||
}
|
||
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƺ<EFBFBD><C6BA>Ӽ<EFBFBD><D3BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD>Ϊ<EFBFBD><CEAA>
|
||
if(main_name == NULL)
|
||
{
|
||
return SCRIPT_PARSER_KEYNAME_NULL;
|
||
}
|
||
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>buffer<65>Ƿ<EFBFBD>Ϊ<EFBFBD><CEAA>
|
||
if(str == NULL)
|
||
{
|
||
return SCRIPT_PARSER_DATA_VALUE_NULL;
|
||
}
|
||
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƺ<EFBFBD><C6BA>Ӽ<EFBFBD><D3BC><EFBFBD><EFBFBD>ƣ<EFBFBD><C6A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>31<33>ֽ<EFBFBD><D6BD><EFBFBD><EFBFBD><EFBFBD>ȡ31<33>ֽ<EFBFBD>
|
||
for(i=0;i<gd->script_main_key_count;i++)
|
||
{
|
||
main_key = (script_main_key_t *)(gd->script_mod_buf + (sizeof(script_head_t)) + i * sizeof(script_main_key_t));
|
||
if(strcmp(main_key->main_name, main_name)) //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƥ<EFBFBD>䣬Ѱ<E4A3AC><D1B0><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||
{
|
||
continue;
|
||
}
|
||
if(data_count > main_key->lenth)
|
||
{
|
||
data_max = main_key->lenth;
|
||
}
|
||
else
|
||
{
|
||
data_max = data_count;
|
||
}
|
||
//<2F><><EFBFBD><EFBFBD>ƥ<EFBFBD>䣬Ѱ<E4A3AC><D1B0><EFBFBD>Ӽ<EFBFBD><D3BC><EFBFBD><EFBFBD><EFBFBD>ƥ<EFBFBD><C6A5>
|
||
for(j=0;j<data_max;j++)
|
||
{
|
||
sub_key = (script_sub_key_t *)(gd->script_mod_buf + (main_key->offset<<2) + (j * sizeof(script_sub_key_t)));
|
||
|
||
pattern = (sub_key->pattern>>16) & 0xffff; //<2F><>ȡ<EFBFBD><C8A1><EFBFBD>ݵ<EFBFBD><DDB5><EFBFBD><EFBFBD><EFBFBD>
|
||
//ȡ<><C8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||
if(pattern == SCIRPT_PARSER_VALUE_TYPE_SINGLE_WORD) //<2F><>word<72><64><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||
{
|
||
*(int *)(gd->script_mod_buf + (sub_key->offset<<2)) = *(int *)data;
|
||
data ++;
|
||
}
|
||
}
|
||
|
||
return 0;
|
||
}
|
||
|
||
return -1;
|
||
}
|
||
|
||
int script_parser_patch(char *main_name, char *sub_name, void *str, int str_size)
|
||
{
|
||
char main_bkname[32], sub_bkname[32];
|
||
char *main_char, *sub_char;
|
||
script_main_key_t *main_key = NULL;
|
||
script_sub_key_t *sub_key = NULL;
|
||
int i, j;
|
||
int pattern, word_count;
|
||
|
||
//<2F><><EFBFBD><EFBFBD><EFBFBD>ű<EFBFBD>buffer<65>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD><EFBFBD>
|
||
if(!gd->script_mod_buf)
|
||
{
|
||
return SCRIPT_PARSER_EMPTY_BUFFER;
|
||
}
|
||
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƺ<EFBFBD><C6BA>Ӽ<EFBFBD><D3BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD>Ϊ<EFBFBD><CEAA>
|
||
if((main_name == NULL) || (sub_name == NULL))
|
||
{
|
||
return SCRIPT_PARSER_KEYNAME_NULL;
|
||
}
|
||
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>buffer<65>Ƿ<EFBFBD>Ϊ<EFBFBD><CEAA>
|
||
if(str == NULL)
|
||
{
|
||
return SCRIPT_PARSER_DATA_VALUE_NULL;
|
||
}
|
||
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƺ<EFBFBD><C6BA>Ӽ<EFBFBD><D3BC><EFBFBD><EFBFBD>ƣ<EFBFBD><C6A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>31<33>ֽ<EFBFBD><D6BD><EFBFBD><EFBFBD><EFBFBD>ȡ31<33>ֽ<EFBFBD>
|
||
main_char = main_name;
|
||
if(_test_str_length(main_name) > 31)
|
||
{
|
||
memset(main_bkname, 0, 32);
|
||
strncpy(main_bkname, main_name, 31);
|
||
main_char = main_bkname;
|
||
}
|
||
sub_char = sub_name;
|
||
if(_test_str_length(sub_name) > 31)
|
||
{
|
||
memset(sub_bkname, 0, 32);
|
||
strncpy(sub_bkname, sub_name, 31);
|
||
sub_char = sub_bkname;
|
||
}
|
||
for(i=0;i<gd->script_main_key_count;i++)
|
||
{
|
||
main_key = (script_main_key_t *)(gd->script_mod_buf + (sizeof(script_head_t)) + i * sizeof(script_main_key_t));
|
||
if(strcmp(main_key->main_name, main_char)) //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƥ<EFBFBD>䣬Ѱ<E4A3AC><D1B0><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||
{
|
||
continue;
|
||
}
|
||
//<2F><><EFBFBD><EFBFBD>ƥ<EFBFBD>䣬Ѱ<E4A3AC><D1B0><EFBFBD>Ӽ<EFBFBD><D3BC><EFBFBD><EFBFBD><EFBFBD>ƥ<EFBFBD><C6A5>
|
||
for(j=0;j<main_key->lenth;j++)
|
||
{
|
||
sub_key = (script_sub_key_t *)(gd->script_mod_buf + (main_key->offset<<2) + (j * sizeof(script_sub_key_t)));
|
||
if(strcmp(sub_key->sub_name, sub_char)) //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƥ<EFBFBD>䣬Ѱ<E4A3AC><D1B0><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||
{
|
||
continue;
|
||
}
|
||
pattern = (sub_key->pattern>>16) & 0xffff; //<2F><>ȡ<EFBFBD><C8A1><EFBFBD>ݵ<EFBFBD><DDB5><EFBFBD><EFBFBD><EFBFBD>
|
||
word_count = (sub_key->pattern>> 0) & 0xffff; //<2F><>ȡ<EFBFBD><C8A1>ռ<EFBFBD>õ<EFBFBD>word<72><64><EFBFBD><EFBFBD>
|
||
//ȡ<><C8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||
if(pattern == SCIRPT_PARSER_VALUE_TYPE_SINGLE_WORD) //<2F><>word<72><64><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||
{
|
||
*(int *)(gd->script_mod_buf + (sub_key->offset<<2)) = *(int *)str;
|
||
|
||
return SCRIPT_PARSER_OK;
|
||
}
|
||
else if(pattern == SCIRPT_PARSER_VALUE_TYPE_GPIO_WORD)
|
||
{
|
||
script_gpio_set_t *user_gpio_cfg = (script_gpio_set_t *)str;
|
||
|
||
memset(gd->script_mod_buf + (sub_key->offset<<2), 0, 24);
|
||
memcpy(gd->script_mod_buf + (sub_key->offset<<2), &user_gpio_cfg->port, 24);
|
||
|
||
return SCRIPT_PARSER_OK;
|
||
}
|
||
else if(pattern == SCIRPT_PARSER_VALUE_TYPE_STRING)
|
||
{
|
||
if(str_size > word_count)
|
||
{
|
||
str_size = word_count;
|
||
}
|
||
memset(gd->script_mod_buf + (sub_key->offset<<2), 0, word_count << 2);
|
||
memcpy(gd->script_mod_buf + (sub_key->offset<<2), str, str_size << 2);
|
||
|
||
return SCRIPT_PARSER_OK;
|
||
}
|
||
}
|
||
}
|
||
|
||
return SCRIPT_PARSER_KEY_NOT_FIND;
|
||
}
|
||
|
||
int script_parser_subkey_count(char *main_name)
|
||
{
|
||
char main_bkname[32];
|
||
char *main_char;
|
||
script_main_key_t *main_key = NULL;
|
||
int i;
|
||
|
||
if(!gd->script_mod_buf)
|
||
{
|
||
return SCRIPT_PARSER_EMPTY_BUFFER;
|
||
}
|
||
|
||
if(main_name == NULL)
|
||
{
|
||
return SCRIPT_PARSER_KEYNAME_NULL;
|
||
}
|
||
|
||
main_char = main_name;
|
||
if(_test_str_length(main_name) > 31)
|
||
{
|
||
memset(main_bkname, 0, 32);
|
||
strncpy(main_bkname, main_name, 31);
|
||
main_char = main_bkname;
|
||
}
|
||
|
||
for(i=0;i<gd->script_main_key_count;i++)
|
||
{
|
||
main_key = (script_main_key_t *)(gd->script_mod_buf + (sizeof(script_head_t)) + i * sizeof(script_main_key_t));
|
||
if(strcmp(main_key->main_name, main_char))
|
||
{
|
||
continue;
|
||
}
|
||
|
||
return main_key->lenth;
|
||
}
|
||
|
||
return -1;
|
||
}
|
||
|
||
int script_parser_mainkey_count(void)
|
||
{
|
||
if(!gd->script_mod_buf)
|
||
{
|
||
return SCRIPT_PARSER_EMPTY_BUFFER;
|
||
}
|
||
|
||
return gd->script_main_key_count;
|
||
}
|
||
|
||
int script_parser_mainkey_get_gpio_count(char *main_name)
|
||
{
|
||
char main_bkname[32];
|
||
char *main_char;
|
||
script_main_key_t *main_key = NULL;
|
||
script_sub_key_t *sub_key = NULL;
|
||
int i, j;
|
||
int pattern, gpio_count = 0;
|
||
|
||
if(!gd->script_mod_buf)
|
||
{
|
||
return SCRIPT_PARSER_EMPTY_BUFFER;
|
||
}
|
||
|
||
if(main_name == NULL)
|
||
{
|
||
return SCRIPT_PARSER_KEYNAME_NULL;
|
||
}
|
||
|
||
main_char = main_name;
|
||
if(_test_str_length(main_name) > 31)
|
||
{
|
||
memset(main_bkname, 0, 32);
|
||
strncpy(main_bkname, main_name, 31);
|
||
main_char = main_bkname;
|
||
}
|
||
|
||
for(i=0;i<gd->script_main_key_count;i++)
|
||
{
|
||
main_key = (script_main_key_t *)(gd->script_mod_buf + (sizeof(script_head_t)) + i * sizeof(script_main_key_t));
|
||
if(strcmp(main_key->main_name, main_char))
|
||
{
|
||
continue;
|
||
}
|
||
|
||
for(j=0;j<main_key->lenth;j++)
|
||
{
|
||
sub_key = (script_sub_key_t *)(gd->script_mod_buf + (main_key->offset<<2) + (j * sizeof(script_sub_key_t)));
|
||
|
||
pattern = (sub_key->pattern>>16) & 0xffff;
|
||
|
||
if(SCIRPT_PARSER_VALUE_TYPE_GPIO_WORD == pattern)
|
||
{
|
||
gpio_count ++;
|
||
}
|
||
}
|
||
}
|
||
|
||
return gpio_count;
|
||
}
|
||
|
||
int script_parser_mainkey_get_gpio_cfg(char *main_name, void *gpio_cfg, int gpio_count)
|
||
{
|
||
char main_bkname[32];
|
||
char *main_char;
|
||
script_main_key_t *main_key = NULL;
|
||
script_sub_key_t *sub_key = NULL;
|
||
script_gpio_set_t *user_gpio_cfg = (script_gpio_set_t *)gpio_cfg;
|
||
int i, j;
|
||
int pattern, user_index;
|
||
|
||
if(!gd->script_mod_buf)
|
||
{
|
||
return SCRIPT_PARSER_EMPTY_BUFFER;
|
||
}
|
||
|
||
if(main_name == NULL)
|
||
{
|
||
return SCRIPT_PARSER_KEYNAME_NULL;
|
||
}
|
||
|
||
memset(user_gpio_cfg, 0, sizeof(script_gpio_set_t) * gpio_count);
|
||
|
||
main_char = main_name;
|
||
if(_test_str_length(main_name) > 31)
|
||
{
|
||
memset(main_bkname, 0, 32);
|
||
strncpy(main_bkname, main_name, 31);
|
||
main_char = main_bkname;
|
||
}
|
||
|
||
for(i=0;i<gd->script_main_key_count;i++)
|
||
{
|
||
main_key = (script_main_key_t *)(gd->script_mod_buf + (sizeof(script_head_t)) + i * sizeof(script_main_key_t));
|
||
if(strcmp(main_key->main_name, main_char))
|
||
{
|
||
continue;
|
||
}
|
||
|
||
/* printf("mainkey name = %s\n", main_key->main_name);*/
|
||
user_index = 0;
|
||
for(j=0;j<main_key->lenth;j++)
|
||
{
|
||
sub_key = (script_sub_key_t *)(gd->script_mod_buf + (main_key->offset<<2) + (j * sizeof(script_sub_key_t)));
|
||
/* printf("subkey name = %s\n", sub_key->sub_name);*/
|
||
pattern = (sub_key->pattern>>16) & 0xffff;
|
||
/* printf("subkey pattern = %d\n", pattern);*/
|
||
|
||
if(SCIRPT_PARSER_VALUE_TYPE_GPIO_WORD == pattern)
|
||
{
|
||
strcpy( user_gpio_cfg[user_index].gpio_name, sub_key->sub_name);
|
||
memcpy(&user_gpio_cfg[user_index].port, gd->script_mod_buf + (sub_key->offset<<2), sizeof(script_gpio_set_t) - 32);
|
||
user_index++;
|
||
if(user_index >= gpio_count)
|
||
{
|
||
break;
|
||
}
|
||
}
|
||
}
|
||
return SCRIPT_PARSER_OK;
|
||
}
|
||
|
||
return SCRIPT_PARSER_KEY_NOT_FIND;
|
||
}
|
||
|
||
/**#############################################################################################################
|
||
*
|
||
* GPIO(PIN) Operations
|
||
*
|
||
-##############################################################################################################*/
|
||
#define PIO_REG_CFG(n, i) ((volatile unsigned int *)( SUNXI_PIO_BASE + ((n)-1)*0x24 + ((i)<<2) + 0x00))
|
||
#define PIO_REG_DLEVEL(n, i) ((volatile unsigned int *)( SUNXI_PIO_BASE + ((n)-1)*0x24 + ((i)<<2) + 0x14))
|
||
#define PIO_REG_PULL(n, i) ((volatile unsigned int *)( SUNXI_PIO_BASE + ((n)-1)*0x24 + ((i)<<2) + 0x1C))
|
||
#define PIO_REG_DATA(n) ((volatile unsigned int *)( SUNXI_PIO_BASE + ((n)-1)*0x24 + 0x10))
|
||
|
||
#define PIO_REG_CFG_VALUE(n, i) (readl( SUNXI_PIO_BASE + ((n)-1)*0x24 + ((i)<<2) + 0x00))
|
||
#define PIO_REG_DLEVEL_VALUE(n, i) (readl( SUNXI_PIO_BASE + ((n)-1)*0x24 + ((i)<<2) + 0x14))
|
||
#define PIO_REG_PULL_VALUE(n, i) (readl( SUNXI_PIO_BASE + ((n)-1)*0x24 + ((i)<<2) + 0x1C))
|
||
#define PIO_REG_DATA_VALUE(n) (readl( SUNXI_PIO_BASE + ((n)-1)*0x24 + 0x10))
|
||
#define PIO_REG_BASE(n) ((volatile unsigned int *)(SUNXI_PIO_BASE +((n)-1)*24))
|
||
|
||
#ifdef SUNXI_R_PIO_BASE
|
||
|
||
#define R_PIO_REG_CFG(n, i) ((volatile unsigned int *)( SUNXI_R_PIO_BASE + ((n)-12)*0x24 + ((i)<<2) + 0x00))
|
||
#define R_PIO_REG_DLEVEL(n, i) ((volatile unsigned int *)( SUNXI_R_PIO_BASE + ((n)-12)*0x24 + ((i)<<2) + 0x14))
|
||
#define R_PIO_REG_PULL(n, i) ((volatile unsigned int *)( SUNXI_R_PIO_BASE + ((n)-12)*0x24 + ((i)<<2) + 0x1C))
|
||
#define R_PIO_REG_DATA(n) ((volatile unsigned int *)( SUNXI_R_PIO_BASE + ((n)-12)*0x24 + 0x10))
|
||
|
||
#define R_PIO_REG_CFG_VALUE(n, i) (smc_readl( SUNXI_R_PIO_BASE + ((n)-12)*0x24 + ((i)<<2) + 0x00))
|
||
#define R_PIO_REG_DLEVEL_VALUE(n, i) (smc_readl( SUNXI_R_PIO_BASE + ((n)-12)*0x24 + ((i)<<2) + 0x14))
|
||
#define R_PIO_REG_PULL_VALUE(n, i) (smc_readl( SUNXI_R_PIO_BASE + ((n)-12)*0x24 + ((i)<<2) + 0x1C))
|
||
#define R_PIO_REG_DATA_VALUE(n) (smc_readl( SUNXI_R_PIO_BASE + ((n)-12)*0x24 + 0x10))
|
||
#define R_PIO_REG_BASE(n) ((volatile unsigned int *)(SUNXI_R_PIO_BASE +((n)-12)*24))
|
||
|
||
#endif
|
||
typedef struct
|
||
{
|
||
int mul_sel;
|
||
int pull;
|
||
int drv_level;
|
||
int data;
|
||
} gpio_status_set_t;
|
||
|
||
typedef struct
|
||
{
|
||
char gpio_name[32];
|
||
int port;
|
||
int port_num;
|
||
gpio_status_set_t user_gpio_status;
|
||
gpio_status_set_t hardware_gpio_status;
|
||
} system_gpio_set_t;
|
||
|
||
/*
|
||
****************************************************************************************************
|
||
*
|
||
* CSP_PIN_init
|
||
*
|
||
* Description:
|
||
* init
|
||
*
|
||
* Parameters:
|
||
* Return value:
|
||
* EGPIO_SUCCESS/EGPIO_FAIL
|
||
****************************************************************************************************
|
||
*/
|
||
|
||
int sw_gpio_init(void)
|
||
{
|
||
return script_parser_init((char *)SYS_CONFIG_MEMBASE);
|
||
}
|
||
|
||
/*
|
||
****************************************************************************************************
|
||
*
|
||
* CSP_PIN_exit
|
||
*
|
||
* Description:
|
||
* exit
|
||
*
|
||
* Parameters:
|
||
*
|
||
* Return value:
|
||
* EGPIO_SUCCESS/EGPIO_FAIL
|
||
****************************************************************************************************
|
||
*/
|
||
__s32 gpio_exit(void)
|
||
{
|
||
return 0;
|
||
}
|
||
|
||
/*
|
||
************************************************************************************************************
|
||
*
|
||
* function
|
||
*
|
||
* name :
|
||
*
|
||
* parmeters :
|
||
*
|
||
* return :
|
||
*
|
||
* note :
|
||
*
|
||
*
|
||
************************************************************************************************************
|
||
*/
|
||
#ifdef SUNXI_R_PIO_BASE
|
||
static int gpio_set_axpgpio_value(int pmu_type, int port_num, int level)
|
||
{
|
||
int ret = 0;
|
||
|
||
if(port_num == 0)
|
||
{
|
||
ret = axp_set_supply_status(pmu_type, PMU_SUPPLY_GPIO0, 0, level);
|
||
}
|
||
else if (port_num == 1)
|
||
{
|
||
ret = axp_set_supply_status(pmu_type, PMU_SUPPLY_GPIO1, 0, level);
|
||
}
|
||
|
||
if(ret)
|
||
{
|
||
printf("set axp gpio failed\n");
|
||
return -1;
|
||
}
|
||
|
||
return 0;
|
||
}
|
||
#endif
|
||
|
||
#define GPIO_REG_READ(reg) (smc_readl((unsigned int)(reg)))
|
||
#define GPIO_REG_WRITE(reg, value) (smc_writel(value, (unsigned int)(reg)))
|
||
|
||
#define PIOC_REG_o_CFG0 0x00
|
||
#define PIOC_REG_o_CFG1 0x04
|
||
#define PIOC_REG_o_CFG2 0x08
|
||
#define PIOC_REG_o_CFG3 0x0C
|
||
#define PIOC_REG_o_DATA 0x10
|
||
#define PIOC_REG_o_DRV0 0x14
|
||
#define PIOC_REG_o_DRV1 0x18
|
||
#define PIOC_REG_o_PUL0 0x1C
|
||
#define PIOC_REG_o_PUL1 0x20
|
||
|
||
|
||
/*
|
||
************************************************************************************************************
|
||
*
|
||
* gpio_request_early
|
||
*
|
||
* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƣ<EFBFBD>
|
||
*
|
||
* <20><><EFBFBD><EFBFBD><EFBFBD>б<EFBFBD><D0B1><EFBFBD>
|
||
*
|
||
*
|
||
*
|
||
* <20><><EFBFBD><EFBFBD>ֵ <20><>
|
||
*
|
||
* ˵<><CBB5> <20><>
|
||
*
|
||
*
|
||
************************************************************************************************************
|
||
*/
|
||
#ifdef SUNXI_R_PIO_BASE
|
||
int gpio_request_early(void *user_gpio_list, __u32 group_count_max, __s32 set_gpio)
|
||
{
|
||
user_gpio_set_t *tmp_user_gpio_data, *gpio_list;
|
||
__u32 first_port; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ч<EFBFBD><D0A7>GPIO<49>ĸ<EFBFBD><C4B8><EFBFBD>
|
||
__u32 tmp_group_func_data = 0;
|
||
__u32 tmp_group_pull_data = 0;
|
||
__u32 tmp_group_dlevel_data = 0;
|
||
__u32 tmp_group_data_data = 0;
|
||
__u32 data_change = 0;
|
||
// __u32 *tmp_group_port_addr;
|
||
volatile __u32 *tmp_group_func_addr = NULL, *tmp_group_pull_addr = NULL;
|
||
volatile __u32 *tmp_group_dlevel_addr = NULL, *tmp_group_data_addr = NULL;
|
||
__u32 port, port_num, pre_port_num, port_num_func, port_num_pull;
|
||
__u32 pre_port = 0x7fffffff, pre_port_num_func = 0x7fffffff;
|
||
__u32 pre_port_num_pull = 0x7fffffff;
|
||
__s32 i, tmp_val;
|
||
int cpus_flag = 0;
|
||
|
||
gpio_list = (user_gpio_set_t *)user_gpio_list;
|
||
for(first_port = 0; first_port < group_count_max; first_port++)
|
||
{
|
||
tmp_user_gpio_data = gpio_list + first_port;
|
||
port = tmp_user_gpio_data->port; //<2F><><EFBFBD><EFBFBD><EFBFBD>˿<EFBFBD><CBBF><EFBFBD>ֵ
|
||
port_num = tmp_user_gpio_data->port_num; //<2F><><EFBFBD><EFBFBD><EFBFBD>˿<EFBFBD><CBBF>е<EFBFBD>ijһ<C4B3><D2BB>GPIO
|
||
pre_port_num = port_num;
|
||
if(!port)
|
||
{
|
||
continue;
|
||
}
|
||
|
||
port_num_func = (port_num >> 3);
|
||
port_num_pull = (port_num >> 4);
|
||
if(port == 0xffff)
|
||
{
|
||
tmp_group_data_data = tmp_user_gpio_data->data & 1;
|
||
data_change = 1;
|
||
|
||
pre_port = port;
|
||
pre_port_num_func = port_num_func;
|
||
pre_port_num_pull = port_num_pull;
|
||
}
|
||
else
|
||
{
|
||
if(port >= 12)
|
||
cpus_flag = 1;
|
||
else
|
||
cpus_flag = 0;
|
||
|
||
if(!cpus_flag)
|
||
{
|
||
tmp_group_func_addr = PIO_REG_CFG(port, port_num_func); //<2F><><EFBFBD>¹<EFBFBD><C2B9>ܼĴ<DCBC><C4B4><EFBFBD><EFBFBD><EFBFBD>ַ
|
||
tmp_group_pull_addr = PIO_REG_PULL(port, port_num_pull); //<2F><><EFBFBD><EFBFBD>pull<6C>Ĵ<EFBFBD><C4B4><EFBFBD>
|
||
tmp_group_dlevel_addr = PIO_REG_DLEVEL(port, port_num_pull);//<2F><><EFBFBD><EFBFBD>level<65>Ĵ<EFBFBD><C4B4><EFBFBD>
|
||
tmp_group_data_addr = PIO_REG_DATA(port); //<2F><><EFBFBD><EFBFBD>data<74>Ĵ<EFBFBD><C4B4><EFBFBD>
|
||
}
|
||
else
|
||
{
|
||
tmp_group_func_addr = R_PIO_REG_CFG(port, port_num_func); //<2F><><EFBFBD>¹<EFBFBD><C2B9>ܼĴ<DCBC><C4B4><EFBFBD><EFBFBD><EFBFBD>ַ
|
||
tmp_group_pull_addr = R_PIO_REG_PULL(port, port_num_pull); //<2F><><EFBFBD><EFBFBD>pull<6C>Ĵ<EFBFBD><C4B4><EFBFBD>
|
||
tmp_group_dlevel_addr = R_PIO_REG_DLEVEL(port, port_num_pull);//<2F><><EFBFBD><EFBFBD>level<65>Ĵ<EFBFBD><C4B4><EFBFBD>
|
||
tmp_group_data_addr = R_PIO_REG_DATA(port); //<2F><><EFBFBD><EFBFBD>data<74>Ĵ<EFBFBD><C4B4><EFBFBD>
|
||
|
||
}
|
||
tmp_group_func_data = GPIO_REG_READ(tmp_group_func_addr);
|
||
tmp_group_pull_data = GPIO_REG_READ(tmp_group_pull_addr);
|
||
tmp_group_dlevel_data = GPIO_REG_READ(tmp_group_dlevel_addr);
|
||
tmp_group_data_data = GPIO_REG_READ(tmp_group_data_addr);
|
||
|
||
pre_port = port;
|
||
pre_port_num_func = port_num_func;
|
||
pre_port_num_pull = port_num_pull;
|
||
//<2F><><EFBFBD>¹<EFBFBD><C2B9>ܼĴ<DCBC><C4B4><EFBFBD>
|
||
tmp_val = (port_num - (port_num_func << 3)) << 2;
|
||
tmp_group_func_data &= ~(0x07 << tmp_val);
|
||
if(set_gpio)
|
||
{
|
||
tmp_group_func_data |= (tmp_user_gpio_data->mul_sel & 0x07) << tmp_val;
|
||
}
|
||
//<2F><><EFBFBD><EFBFBD>pull<6C><6C>ֵ<EFBFBD><D6B5><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD><EFBFBD>pull<6C>Ĵ<EFBFBD><C4B4><EFBFBD>
|
||
tmp_val = (port_num - (port_num_pull << 4)) << 1;
|
||
if(tmp_user_gpio_data->pull >= 0)
|
||
{
|
||
tmp_group_pull_data &= ~( 0x03 << tmp_val);
|
||
tmp_group_pull_data |= (tmp_user_gpio_data->pull & 0x03) << tmp_val;
|
||
}
|
||
//<2F><><EFBFBD><EFBFBD>driver level<65><6C>ֵ<EFBFBD><D6B5><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD><EFBFBD>driver level<65>Ĵ<EFBFBD><C4B4><EFBFBD>
|
||
if(tmp_user_gpio_data->drv_level >= 0)
|
||
{
|
||
tmp_group_dlevel_data &= ~( 0x03 << tmp_val);
|
||
tmp_group_dlevel_data |= (tmp_user_gpio_data->drv_level & 0x03) << tmp_val;
|
||
}
|
||
//<2F><><EFBFBD><EFBFBD><EFBFBD>û<EFBFBD><C3BB><EFBFBD><EFBFBD>룬<EFBFBD>Լ<EFBFBD><D4BC><EFBFBD><EFBFBD>ܷ<EFBFBD><DCB7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD><EFBFBD>data<74>Ĵ<EFBFBD><C4B4><EFBFBD>
|
||
if(tmp_user_gpio_data->mul_sel == 1)
|
||
{
|
||
if(tmp_user_gpio_data->data >= 0)
|
||
{
|
||
tmp_val = tmp_user_gpio_data->data & 1;
|
||
tmp_group_data_data &= ~(1 << port_num);
|
||
tmp_group_data_data |= tmp_val << port_num;
|
||
data_change = 1;
|
||
}
|
||
}
|
||
}
|
||
|
||
break;
|
||
}
|
||
//<2F><><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݴ<EFBFBD><DDB4><EFBFBD>
|
||
if(first_port >= group_count_max)
|
||
{
|
||
return -1;
|
||
}
|
||
|
||
//<2F><><EFBFBD><EFBFBD><EFBFBD>û<EFBFBD><C3BB><EFBFBD><EFBFBD><EFBFBD>
|
||
for(i = first_port + 1; i < group_count_max; i++)
|
||
{
|
||
tmp_user_gpio_data = gpio_list + i; //gpio_set<65><74><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8><EFBFBD>û<EFBFBD><C3BB><EFBFBD>ÿ<EFBFBD><C3BF>GPIO<49><4F><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ա
|
||
port = tmp_user_gpio_data->port; //<2F><><EFBFBD><EFBFBD><EFBFBD>˿<EFBFBD><CBBF><EFBFBD>ֵ
|
||
port_num = tmp_user_gpio_data->port_num; //<2F><><EFBFBD><EFBFBD><EFBFBD>˿<EFBFBD><CBBF>е<EFBFBD>ijһ<C4B3><D2BB>GPIO
|
||
if(!port)
|
||
{
|
||
break;
|
||
}
|
||
port_num_func = (port_num >> 3);
|
||
port_num_pull = (port_num >> 4);
|
||
|
||
if(port >= 12)
|
||
cpus_flag = 1;
|
||
else
|
||
cpus_flag = 0;
|
||
|
||
if((port_num_pull != pre_port_num_pull) || (port != pre_port) || (pre_port == 0xffff)) //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ<EFBFBD>ǰ<EFBFBD><C7B0><EFBFBD>ŵĶ˿ڲ<CBBF>һ<EFBFBD>£<EFBFBD><C2A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڵ<EFBFBD>pull<6C>Ĵ<EFBFBD><C4B4><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB>
|
||
{
|
||
if(pre_port == 0xffff)
|
||
{
|
||
if(data_change)
|
||
{
|
||
data_change = 0;
|
||
gpio_set_axpgpio_value(0, pre_port_num, tmp_group_data_data);
|
||
}
|
||
}
|
||
else
|
||
{
|
||
GPIO_REG_WRITE(tmp_group_func_addr, tmp_group_func_data); //<2F><>д<EFBFBD><D0B4><EFBFBD>ܼĴ<DCBC><C4B4><EFBFBD>
|
||
GPIO_REG_WRITE(tmp_group_pull_addr, tmp_group_pull_data); //<2F><>дpull<6C>Ĵ<EFBFBD><C4B4><EFBFBD>
|
||
GPIO_REG_WRITE(tmp_group_dlevel_addr, tmp_group_dlevel_data); //<2F><>дdriver level<65>Ĵ<EFBFBD><C4B4><EFBFBD>
|
||
if(data_change)
|
||
{
|
||
data_change = 0;
|
||
GPIO_REG_WRITE(tmp_group_data_addr, tmp_group_data_data); //<2F><>дdata<74>Ĵ<EFBFBD><C4B4><EFBFBD>
|
||
}
|
||
}
|
||
if(port == 0xffff)
|
||
{
|
||
tmp_group_data_data = tmp_user_gpio_data->data & 1;
|
||
data_change = 1;
|
||
}
|
||
else
|
||
{
|
||
if(!cpus_flag)
|
||
{
|
||
tmp_group_func_addr = PIO_REG_CFG(port, port_num_func); //<2F><><EFBFBD>¹<EFBFBD><C2B9>ܼĴ<DCBC><C4B4><EFBFBD><EFBFBD><EFBFBD>ַ
|
||
tmp_group_pull_addr = PIO_REG_PULL(port, port_num_pull); //<2F><><EFBFBD><EFBFBD>pull<6C>Ĵ<EFBFBD><C4B4><EFBFBD>
|
||
tmp_group_dlevel_addr = PIO_REG_DLEVEL(port, port_num_pull);//<2F><><EFBFBD><EFBFBD>level<65>Ĵ<EFBFBD><C4B4><EFBFBD>
|
||
tmp_group_data_addr = PIO_REG_DATA(port); //<2F><><EFBFBD><EFBFBD>data<74>Ĵ<EFBFBD><C4B4><EFBFBD>
|
||
}
|
||
else
|
||
{
|
||
tmp_group_func_addr = R_PIO_REG_CFG(port, port_num_func); //<2F><><EFBFBD>¹<EFBFBD><C2B9>ܼĴ<DCBC><C4B4><EFBFBD><EFBFBD><EFBFBD>ַ
|
||
tmp_group_pull_addr = R_PIO_REG_PULL(port, port_num_pull); //<2F><><EFBFBD><EFBFBD>pull<6C>Ĵ<EFBFBD><C4B4><EFBFBD>
|
||
tmp_group_dlevel_addr = R_PIO_REG_DLEVEL(port, port_num_pull);//<2F><><EFBFBD><EFBFBD>level<65>Ĵ<EFBFBD><C4B4><EFBFBD>
|
||
tmp_group_data_addr = R_PIO_REG_DATA(port); //<2F><><EFBFBD><EFBFBD>data<74>Ĵ<EFBFBD><C4B4><EFBFBD>
|
||
|
||
}
|
||
tmp_group_func_data = GPIO_REG_READ(tmp_group_func_addr);
|
||
tmp_group_pull_data = GPIO_REG_READ(tmp_group_pull_addr);
|
||
tmp_group_dlevel_data = GPIO_REG_READ(tmp_group_dlevel_addr);
|
||
tmp_group_data_data = GPIO_REG_READ(tmp_group_data_addr);
|
||
}
|
||
}
|
||
else if(pre_port_num_func != port_num_func) //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ<EFBFBD>ǰ<EFBFBD><C7B0><EFBFBD>ŵĹ<C5B5><C4B9>ܼĴ<DCBC><C4B4><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB>
|
||
{
|
||
if(pre_port == 0xffff)
|
||
{
|
||
gpio_set_axpgpio_value(0, pre_port_num, tmp_group_data_data);
|
||
}
|
||
else
|
||
{
|
||
GPIO_REG_WRITE(tmp_group_func_addr, tmp_group_func_data); //<2F><>ֻ<EFBFBD><D6BB>д<EFBFBD><D0B4><EFBFBD>ܼĴ<DCBC><C4B4><EFBFBD>
|
||
}
|
||
|
||
if(port == 0xffff)
|
||
{
|
||
tmp_group_data_data = tmp_user_gpio_data->data & 1;
|
||
}
|
||
else
|
||
{
|
||
if(!cpus_flag)
|
||
tmp_group_func_addr = PIO_REG_CFG(port, port_num_func); //<2F><><EFBFBD>¹<EFBFBD><C2B9>ܼĴ<DCBC><C4B4><EFBFBD><EFBFBD><EFBFBD>ַ
|
||
else
|
||
tmp_group_func_addr = R_PIO_REG_CFG(port, port_num_func);
|
||
tmp_group_func_data = GPIO_REG_READ(tmp_group_func_addr);
|
||
}
|
||
}
|
||
//<2F><><EFBFBD>浱ǰӲ<C7B0><D3B2><EFBFBD>Ĵ<EFBFBD><C4B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||
pre_port_num_pull = port_num_pull; //<2F><><EFBFBD>õ<EFBFBD>ǰGPIO<49><4F>Ϊǰһ<C7B0><D2BB>GPIO
|
||
pre_port_num_func = port_num_func;
|
||
pre_port = port;
|
||
pre_port_num = port_num;
|
||
if(port == 0xffff)
|
||
{
|
||
if(tmp_user_gpio_data->data >= 0)
|
||
{
|
||
tmp_group_data_data = tmp_user_gpio_data->data & 1;
|
||
data_change = 1;
|
||
}
|
||
}
|
||
else
|
||
{
|
||
//<2F><><EFBFBD>¹<EFBFBD><C2B9>ܼĴ<DCBC><C4B4><EFBFBD>
|
||
tmp_val = (port_num - (port_num_func << 3)) << 2;
|
||
if(tmp_user_gpio_data->mul_sel >= 0)
|
||
{
|
||
tmp_group_func_data &= ~( 0x07 << tmp_val);
|
||
if(set_gpio)
|
||
{
|
||
tmp_group_func_data |= (tmp_user_gpio_data->mul_sel & 0x07) << tmp_val;
|
||
}
|
||
}
|
||
//<2F><><EFBFBD><EFBFBD>pull<6C><6C>ֵ<EFBFBD><D6B5><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD><EFBFBD>pull<6C>Ĵ<EFBFBD><C4B4><EFBFBD>
|
||
tmp_val = (port_num - (port_num_pull << 4)) << 1;
|
||
if(tmp_user_gpio_data->pull >= 0)
|
||
{
|
||
tmp_group_pull_data &= ~( 0x03 << tmp_val);
|
||
tmp_group_pull_data |= (tmp_user_gpio_data->pull & 0x03) << tmp_val;
|
||
}
|
||
//<2F><><EFBFBD><EFBFBD>driver level<65><6C>ֵ<EFBFBD><D6B5><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD><EFBFBD>driver level<65>Ĵ<EFBFBD><C4B4><EFBFBD>
|
||
if(tmp_user_gpio_data->drv_level >= 0)
|
||
{
|
||
tmp_group_dlevel_data &= ~( 0x03 << tmp_val);
|
||
tmp_group_dlevel_data |= (tmp_user_gpio_data->drv_level & 0x03) << tmp_val;
|
||
}
|
||
//<2F><><EFBFBD><EFBFBD><EFBFBD>û<EFBFBD><C3BB><EFBFBD><EFBFBD>룬<EFBFBD>Լ<EFBFBD><D4BC><EFBFBD><EFBFBD>ܷ<EFBFBD><DCB7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD><EFBFBD>data<74>Ĵ<EFBFBD><C4B4><EFBFBD>
|
||
if(tmp_user_gpio_data->mul_sel == 1)
|
||
{
|
||
if(tmp_user_gpio_data->data >= 0)
|
||
{
|
||
tmp_val = tmp_user_gpio_data->data & 1;
|
||
tmp_group_data_data &= ~(1 << port_num);
|
||
tmp_group_data_data |= tmp_val << port_num;
|
||
data_change = 1;
|
||
}
|
||
}
|
||
}
|
||
}
|
||
//forѭ<72><D1AD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڻ<EFBFBD>û<EFBFBD>л<EFBFBD>д<EFBFBD>ļĴ<C4BC><C4B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>д<EFBFBD>ص<EFBFBD>Ӳ<EFBFBD><D3B2><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||
if(port == 0xffff)
|
||
{
|
||
if(data_change)
|
||
{
|
||
gpio_set_axpgpio_value(0, port_num, tmp_group_data_data);
|
||
}
|
||
}
|
||
else
|
||
{
|
||
if(tmp_group_func_addr) //ֻҪ<D6BB><D2AA><EFBFBD>¹<EFBFBD><C2B9>Ĵ<EFBFBD><C4B4><EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD>Ϳ<EFBFBD><CDBF>Զ<EFBFBD>Ӳ<EFBFBD><D3B2><EFBFBD><EFBFBD>ֵ
|
||
{ //<2F><>ô<EFBFBD><C3B4><EFBFBD><EFBFBD><EFBFBD>е<EFBFBD>ֵȫ<D6B5><C8AB><EFBFBD><EFBFBD>д<EFBFBD><D0B4>Ӳ<EFBFBD><D3B2><EFBFBD>Ĵ<EFBFBD><C4B4><EFBFBD>
|
||
GPIO_REG_WRITE(tmp_group_func_addr, tmp_group_func_data); //<2F><>д<EFBFBD><D0B4><EFBFBD>ܼĴ<DCBC><C4B4><EFBFBD>
|
||
GPIO_REG_WRITE(tmp_group_pull_addr, tmp_group_pull_data); //<2F><>дpull<6C>Ĵ<EFBFBD><C4B4><EFBFBD>
|
||
GPIO_REG_WRITE(tmp_group_dlevel_addr, tmp_group_dlevel_data); //<2F><>дdriver level<65>Ĵ<EFBFBD><C4B4><EFBFBD>
|
||
if(data_change)
|
||
{
|
||
GPIO_REG_WRITE(tmp_group_data_addr, tmp_group_data_data); //<2F><>дdata<74>Ĵ<EFBFBD><C4B4><EFBFBD>
|
||
}
|
||
}
|
||
}
|
||
|
||
return 0;
|
||
}
|
||
#else
|
||
int gpio_request_early(void *user_gpio_list, __u32 group_count_max, __s32 set_gpio)
|
||
{
|
||
user_gpio_set_t *tmp_user_gpio_data, *gpio_list;
|
||
__u32 first_port; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ч<EFBFBD><D0A7>GPIO<49>ĸ<EFBFBD><C4B8><EFBFBD>
|
||
__u32 tmp_group_func_data;
|
||
__u32 tmp_group_pull_data;
|
||
__u32 tmp_group_dlevel_data;
|
||
__u32 tmp_group_data_data;
|
||
__u32 data_change = 0;
|
||
// __u32 *tmp_group_port_addr;
|
||
volatile __u32 *tmp_group_func_addr, *tmp_group_pull_addr;
|
||
volatile __u32 *tmp_group_dlevel_addr, *tmp_group_data_addr;
|
||
__u32 port, port_num, port_num_func, port_num_pull;
|
||
__u32 pre_port, pre_port_num_func;
|
||
__u32 pre_port_num_pull;
|
||
__s32 i, tmp_val;
|
||
|
||
|
||
gpio_list = (user_gpio_set_t *)user_gpio_list;
|
||
|
||
for(first_port = 0; first_port < group_count_max; first_port++)
|
||
{
|
||
tmp_user_gpio_data = gpio_list + first_port;
|
||
port = tmp_user_gpio_data->port; //<2F><><EFBFBD><EFBFBD><EFBFBD>˿<EFBFBD><CBBF><EFBFBD>ֵ
|
||
port_num = tmp_user_gpio_data->port_num; //<2F><><EFBFBD><EFBFBD><EFBFBD>˿<EFBFBD><CBBF>е<EFBFBD>ijһ<C4B3><D2BB>GPIO
|
||
if(!port)
|
||
{
|
||
continue;
|
||
}
|
||
port_num_func = (port_num >> 3);
|
||
port_num_pull = (port_num >> 4);
|
||
|
||
tmp_group_func_addr = PIO_REG_CFG(port, port_num_func); //<2F><><EFBFBD>¹<EFBFBD><C2B9>ܼĴ<DCBC><C4B4><EFBFBD><EFBFBD><EFBFBD>ַ
|
||
tmp_group_pull_addr = PIO_REG_PULL(port, port_num_pull); //<2F><><EFBFBD><EFBFBD>pull<6C>Ĵ<EFBFBD><C4B4><EFBFBD>
|
||
tmp_group_dlevel_addr = PIO_REG_DLEVEL(port, port_num_pull);//<2F><><EFBFBD><EFBFBD>level<65>Ĵ<EFBFBD><C4B4><EFBFBD>
|
||
tmp_group_data_addr = PIO_REG_DATA(port); //<2F><><EFBFBD><EFBFBD>data<74>Ĵ<EFBFBD><C4B4><EFBFBD>
|
||
|
||
tmp_group_func_data = GPIO_REG_READ(tmp_group_func_addr);
|
||
tmp_group_pull_data = GPIO_REG_READ(tmp_group_pull_addr);
|
||
tmp_group_dlevel_data = GPIO_REG_READ(tmp_group_dlevel_addr);
|
||
tmp_group_data_data = GPIO_REG_READ(tmp_group_data_addr);
|
||
|
||
pre_port = port;
|
||
pre_port_num_func = port_num_func;
|
||
pre_port_num_pull = port_num_pull;
|
||
//<2F><><EFBFBD>¹<EFBFBD><C2B9>ܼĴ<DCBC><C4B4><EFBFBD>
|
||
tmp_val = (port_num - (port_num_func << 3)) << 2;
|
||
tmp_group_func_data &= ~(0x07 << tmp_val);
|
||
if(set_gpio)
|
||
{
|
||
tmp_group_func_data |= (tmp_user_gpio_data->mul_sel & 0x07) << tmp_val;
|
||
}
|
||
//<2F><><EFBFBD><EFBFBD>pull<6C><6C>ֵ<EFBFBD><D6B5><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD><EFBFBD>pull<6C>Ĵ<EFBFBD><C4B4><EFBFBD>
|
||
tmp_val = (port_num - (port_num_pull << 4)) << 1;
|
||
if(tmp_user_gpio_data->pull >= 0)
|
||
{
|
||
tmp_group_pull_data &= ~( 0x03 << tmp_val);
|
||
tmp_group_pull_data |= (tmp_user_gpio_data->pull & 0x03) << tmp_val;
|
||
}
|
||
//<2F><><EFBFBD><EFBFBD>driver level<65><6C>ֵ<EFBFBD><D6B5><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD><EFBFBD>driver level<65>Ĵ<EFBFBD><C4B4><EFBFBD>
|
||
if(tmp_user_gpio_data->drv_level >= 0)
|
||
{
|
||
tmp_group_dlevel_data &= ~( 0x03 << tmp_val);
|
||
tmp_group_dlevel_data |= (tmp_user_gpio_data->drv_level & 0x03) << tmp_val;
|
||
}
|
||
//<2F><><EFBFBD><EFBFBD><EFBFBD>û<EFBFBD><C3BB><EFBFBD><EFBFBD>룬<EFBFBD>Լ<EFBFBD><D4BC><EFBFBD><EFBFBD>ܷ<EFBFBD><DCB7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD><EFBFBD>data<74>Ĵ<EFBFBD><C4B4><EFBFBD>
|
||
if(tmp_user_gpio_data->mul_sel == 1)
|
||
{
|
||
if(tmp_user_gpio_data->data >= 0)
|
||
{
|
||
tmp_val = tmp_user_gpio_data->data & 1;
|
||
tmp_group_data_data &= ~(1 << port_num);
|
||
tmp_group_data_data |= tmp_val << port_num;
|
||
data_change = 1;
|
||
}
|
||
}
|
||
|
||
break;
|
||
}
|
||
//<2F><><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݴ<EFBFBD><DDB4><EFBFBD>
|
||
if(first_port >= group_count_max)
|
||
{
|
||
return -1;
|
||
}
|
||
//<2F><><EFBFBD><EFBFBD><EFBFBD>û<EFBFBD><C3BB><EFBFBD><EFBFBD><EFBFBD>
|
||
for(i = first_port + 1; i < group_count_max; i++)
|
||
{
|
||
tmp_user_gpio_data = gpio_list + i; //gpio_set<65><74><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8><EFBFBD>û<EFBFBD><C3BB><EFBFBD>ÿ<EFBFBD><C3BF>GPIO<49><4F><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ա
|
||
port = tmp_user_gpio_data->port; //<2F><><EFBFBD><EFBFBD><EFBFBD>˿<EFBFBD><CBBF><EFBFBD>ֵ
|
||
port_num = tmp_user_gpio_data->port_num; //<2F><><EFBFBD><EFBFBD><EFBFBD>˿<EFBFBD><CBBF>е<EFBFBD>ijһ<C4B3><D2BB>GPIO
|
||
if(!port)
|
||
{
|
||
break;
|
||
}
|
||
port_num_func = (port_num >> 3);
|
||
port_num_pull = (port_num >> 4);
|
||
|
||
if((port_num_pull != pre_port_num_pull) || (port != pre_port)) //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ<EFBFBD>ǰ<EFBFBD><C7B0><EFBFBD>ŵĶ˿ڲ<CBBF>һ<EFBFBD>£<EFBFBD><C2A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڵ<EFBFBD>pull<6C>Ĵ<EFBFBD><C4B4><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB>
|
||
{
|
||
GPIO_REG_WRITE(tmp_group_func_addr, tmp_group_func_data); //<2F><>д<EFBFBD><D0B4><EFBFBD>ܼĴ<DCBC><C4B4><EFBFBD>
|
||
GPIO_REG_WRITE(tmp_group_pull_addr, tmp_group_pull_data); //<2F><>дpull<6C>Ĵ<EFBFBD><C4B4><EFBFBD>
|
||
GPIO_REG_WRITE(tmp_group_dlevel_addr, tmp_group_dlevel_data); //<2F><>дdriver level<65>Ĵ<EFBFBD><C4B4><EFBFBD>
|
||
if(data_change)
|
||
{
|
||
data_change = 0;
|
||
GPIO_REG_WRITE(tmp_group_data_addr, tmp_group_data_data); //<2F><>дdata<74>Ĵ<EFBFBD><C4B4><EFBFBD>
|
||
}
|
||
|
||
tmp_group_func_addr = PIO_REG_CFG(port, port_num_func); //<2F><><EFBFBD>¹<EFBFBD><C2B9>ܼĴ<DCBC><C4B4><EFBFBD><EFBFBD><EFBFBD>ַ
|
||
tmp_group_pull_addr = PIO_REG_PULL(port, port_num_pull); //<2F><><EFBFBD><EFBFBD>pull<6C>Ĵ<EFBFBD><C4B4><EFBFBD>
|
||
tmp_group_dlevel_addr = PIO_REG_DLEVEL(port, port_num_pull);//<2F><><EFBFBD><EFBFBD>level<65>Ĵ<EFBFBD><C4B4><EFBFBD>
|
||
tmp_group_data_addr = PIO_REG_DATA(port); //<2F><><EFBFBD><EFBFBD>data<74>Ĵ<EFBFBD><C4B4><EFBFBD>
|
||
|
||
tmp_group_func_data = GPIO_REG_READ(tmp_group_func_addr);
|
||
tmp_group_pull_data = GPIO_REG_READ(tmp_group_pull_addr);
|
||
tmp_group_dlevel_data = GPIO_REG_READ(tmp_group_dlevel_addr);
|
||
tmp_group_data_data = GPIO_REG_READ(tmp_group_data_addr);
|
||
}
|
||
else if(pre_port_num_func != port_num_func) //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ<EFBFBD>ǰ<EFBFBD><C7B0><EFBFBD>ŵĹ<C5B5><C4B9>ܼĴ<DCBC><C4B4><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB>
|
||
{
|
||
GPIO_REG_WRITE(tmp_group_func_addr, tmp_group_func_data); //<2F><>ֻ<EFBFBD><D6BB>д<EFBFBD><D0B4><EFBFBD>ܼĴ<DCBC><C4B4><EFBFBD>
|
||
tmp_group_func_addr = PIO_REG_CFG(port, port_num_func); //<2F><><EFBFBD>¹<EFBFBD><C2B9>ܼĴ<DCBC><C4B4><EFBFBD><EFBFBD><EFBFBD>ַ
|
||
|
||
tmp_group_func_data = GPIO_REG_READ(tmp_group_func_addr);
|
||
}
|
||
//<2F><><EFBFBD>浱ǰӲ<C7B0><D3B2><EFBFBD>Ĵ<EFBFBD><C4B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||
pre_port_num_pull = port_num_pull; //<2F><><EFBFBD>õ<EFBFBD>ǰGPIO<49><4F>Ϊǰһ<C7B0><D2BB>GPIO
|
||
pre_port_num_func = port_num_func;
|
||
pre_port = port;
|
||
|
||
//<2F><><EFBFBD>¹<EFBFBD><C2B9>ܼĴ<DCBC><C4B4><EFBFBD>
|
||
tmp_val = (port_num - (port_num_func << 3)) << 2;
|
||
if(tmp_user_gpio_data->mul_sel >= 0)
|
||
{
|
||
tmp_group_func_data &= ~( 0x07 << tmp_val);
|
||
if(set_gpio)
|
||
{
|
||
tmp_group_func_data |= (tmp_user_gpio_data->mul_sel & 0x07) << tmp_val;
|
||
}
|
||
}
|
||
//<2F><><EFBFBD><EFBFBD>pull<6C><6C>ֵ<EFBFBD><D6B5><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD><EFBFBD>pull<6C>Ĵ<EFBFBD><C4B4><EFBFBD>
|
||
tmp_val = (port_num - (port_num_pull << 4)) << 1;
|
||
if(tmp_user_gpio_data->pull >= 0)
|
||
{
|
||
tmp_group_pull_data &= ~( 0x03 << tmp_val);
|
||
tmp_group_pull_data |= (tmp_user_gpio_data->pull & 0x03) << tmp_val;
|
||
}
|
||
//<2F><><EFBFBD><EFBFBD>driver level<65><6C>ֵ<EFBFBD><D6B5><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD><EFBFBD>driver level<65>Ĵ<EFBFBD><C4B4><EFBFBD>
|
||
if(tmp_user_gpio_data->drv_level >= 0)
|
||
{
|
||
tmp_group_dlevel_data &= ~( 0x03 << tmp_val);
|
||
tmp_group_dlevel_data |= (tmp_user_gpio_data->drv_level & 0x03) << tmp_val;
|
||
}
|
||
//<2F><><EFBFBD><EFBFBD><EFBFBD>û<EFBFBD><C3BB><EFBFBD><EFBFBD>룬<EFBFBD>Լ<EFBFBD><D4BC><EFBFBD><EFBFBD>ܷ<EFBFBD><DCB7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD><EFBFBD>data<74>Ĵ<EFBFBD><C4B4><EFBFBD>
|
||
if(tmp_user_gpio_data->mul_sel == 1)
|
||
{
|
||
if(tmp_user_gpio_data->data >= 0)
|
||
{
|
||
tmp_val = tmp_user_gpio_data->data & 1;
|
||
tmp_group_data_data &= ~(1 << port_num);
|
||
tmp_group_data_data |= tmp_val << port_num;
|
||
data_change = 1;
|
||
}
|
||
}
|
||
}
|
||
//forѭ<72><D1AD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڻ<EFBFBD>û<EFBFBD>л<EFBFBD>д<EFBFBD>ļĴ<C4BC><C4B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>д<EFBFBD>ص<EFBFBD>Ӳ<EFBFBD><D3B2><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||
if(tmp_group_func_addr) //ֻҪ<D6BB><D2AA><EFBFBD>¹<EFBFBD><C2B9>Ĵ<EFBFBD><C4B4><EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD>Ϳ<EFBFBD><CDBF>Զ<EFBFBD>Ӳ<EFBFBD><D3B2><EFBFBD><EFBFBD>ֵ
|
||
{ //<2F><>ô<EFBFBD><C3B4><EFBFBD><EFBFBD><EFBFBD>е<EFBFBD>ֵȫ<D6B5><C8AB><EFBFBD><EFBFBD>д<EFBFBD><D0B4>Ӳ<EFBFBD><D3B2><EFBFBD>Ĵ<EFBFBD><C4B4><EFBFBD>
|
||
GPIO_REG_WRITE(tmp_group_func_addr, tmp_group_func_data); //<2F><>д<EFBFBD><D0B4><EFBFBD>ܼĴ<DCBC><C4B4><EFBFBD>
|
||
GPIO_REG_WRITE(tmp_group_pull_addr, tmp_group_pull_data); //<2F><>дpull<6C>Ĵ<EFBFBD><C4B4><EFBFBD>
|
||
GPIO_REG_WRITE(tmp_group_dlevel_addr, tmp_group_dlevel_data); //<2F><>дdriver level<65>Ĵ<EFBFBD><C4B4><EFBFBD>
|
||
if(data_change)
|
||
{
|
||
GPIO_REG_WRITE(tmp_group_data_addr, tmp_group_data_data); //<2F><>дdata<74>Ĵ<EFBFBD><C4B4><EFBFBD>
|
||
}
|
||
}
|
||
|
||
return 0;
|
||
}
|
||
|
||
#endif
|
||
|
||
|
||
|
||
/*
|
||
************************************************************************************************************
|
||
*
|
||
* CSP_GPIO_Request
|
||
*
|
||
* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƣ<EFBFBD>
|
||
*
|
||
* <20><><EFBFBD><EFBFBD><EFBFBD>б<EFBFBD><D0B1><EFBFBD>gpio_list <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>õ<EFBFBD><C3B5><EFBFBD>GPIO<49><4F><EFBFBD>ݵ<EFBFBD><DDB5><EFBFBD><EFBFBD>飬GPIO<49><4F>ֱ<EFBFBD><D6B1>ʹ<EFBFBD><CAB9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||
*
|
||
* group_count_max <20><><EFBFBD><EFBFBD><EFBFBD>ij<EFBFBD>Ա<EFBFBD><D4B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>GPIO<49>趨<EFBFBD><E8B6A8>ʱ<EFBFBD><EFBFBD><F2A3ACBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>GPIO<49><4F><EFBFBD><EFBFBD><F3B2BBB3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ
|
||
*
|
||
* <20><><EFBFBD><EFBFBD>ֵ <20><>
|
||
*
|
||
* ˵<><CBB5> <20><><EFBFBD><EFBFBD>ʱû<CAB1><C3BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͻ<EFBFBD><CDBB><EFBFBD><EFBFBD>
|
||
*
|
||
*
|
||
************************************************************************************************************
|
||
*/
|
||
|
||
#ifdef SUNXI_R_PIO_BASE //֧<><D6A7>CPUS GPIO<49><4F><EFBFBD><EFBFBD>
|
||
|
||
u32 gpio_request(user_gpio_set_t *gpio_list, __u32 group_count_max)
|
||
{
|
||
char *user_gpio_buf; //<2F><><EFBFBD><EFBFBD>char<61><72><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||
system_gpio_set_t *user_gpio_set, *tmp_sys_gpio_data; //user_gpio_set<65><74><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڴ<EFBFBD><DAB4>ľ<EFBFBD><C4BE><EFBFBD>
|
||
user_gpio_set_t *tmp_user_gpio_data;
|
||
__u32 real_gpio_count = 0, first_port; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ч<EFBFBD><D0A7>GPIO<49>ĸ<EFBFBD><C4B8><EFBFBD>
|
||
__u32 tmp_group_func_data = 0;
|
||
__u32 tmp_group_pull_data = 0;
|
||
__u32 tmp_group_dlevel_data = 0;
|
||
__u32 tmp_group_data_data = 0;
|
||
__u32 func_change = 0, pull_change = 0;
|
||
__u32 dlevel_change = 0, data_change = 0;
|
||
volatile __u32 *tmp_group_func_addr = NULL, *tmp_group_pull_addr = NULL;
|
||
volatile __u32 *tmp_group_dlevel_addr = NULL, *tmp_group_data_addr = NULL;
|
||
__u32 port, port_num, pre_port_num, port_num_func, port_num_pull;
|
||
__u32 pre_port = 0x7fffffff, pre_port_num_func = 0x7fffffff;
|
||
__u32 pre_port_num_pull = 0x7fffffff;
|
||
__s32 i, tmp_val;
|
||
int cpus_flag = 0;
|
||
if((!gpio_list) || (!group_count_max))
|
||
{
|
||
return (u32)0;
|
||
}
|
||
for(i = 0; i < group_count_max; i++)
|
||
{
|
||
tmp_user_gpio_data = gpio_list + i; //gpio_set<65><74><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8>ÿ<EFBFBD><C3BF>GPIO<49><4F><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ա
|
||
if(!tmp_user_gpio_data->port)
|
||
{
|
||
continue;
|
||
}
|
||
real_gpio_count ++;
|
||
}
|
||
|
||
//SYSCONFIG_DEBUG("to malloc space for pin \n");
|
||
user_gpio_buf = (char *)malloc(16 + sizeof(system_gpio_set_t) * real_gpio_count); //<2F><><EFBFBD><EFBFBD><EFBFBD>ڴ棬<DAB4><E6A3AC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>16<31><36><EFBFBD>ֽڣ<D6BD><DAA3><EFBFBD><EFBFBD>ڴ<EFBFBD><DAB4><EFBFBD>GPIO<49><4F><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ
|
||
if(!user_gpio_buf)
|
||
{
|
||
return (u32)0;
|
||
}
|
||
memset(user_gpio_buf, 0, 16 + sizeof(system_gpio_set_t) * real_gpio_count); //<2F><><EFBFBD><EFBFBD>ȫ<EFBFBD><C8AB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||
*(int *)user_gpio_buf = real_gpio_count; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ч<EFBFBD><D0A7>GPIO<49><4F><EFBFBD><EFBFBD>
|
||
user_gpio_set = (system_gpio_set_t *)(user_gpio_buf + 16); //ָ<><D6B8><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD>ṹ<EFBFBD><E1B9B9>
|
||
//<><D7BC><EFBFBD><EFBFBD>һ<EFBFBD><D2BB>GPIO<49><4F><EFBFBD><EFBFBD>
|
||
for(first_port = 0; first_port < group_count_max; first_port++)
|
||
{
|
||
tmp_user_gpio_data = gpio_list + first_port;
|
||
port = tmp_user_gpio_data->port; //<2F><><EFBFBD><EFBFBD><EFBFBD>˿<EFBFBD><CBBF><EFBFBD>ֵ
|
||
port_num = tmp_user_gpio_data->port_num; //<2F><><EFBFBD><EFBFBD><EFBFBD>˿<EFBFBD><CBBF>е<EFBFBD>ijһ<C4B3><D2BB>GPIO
|
||
pre_port_num = port_num;
|
||
if(!port)
|
||
{
|
||
continue;
|
||
}
|
||
port_num_func = (port_num >> 3);
|
||
port_num_pull = (port_num >> 4);
|
||
|
||
if(port == 0xffff)
|
||
{
|
||
tmp_group_data_data = tmp_user_gpio_data->data & 1;
|
||
}
|
||
else
|
||
{
|
||
if(port >= 12)
|
||
cpus_flag = 1;
|
||
else
|
||
cpus_flag = 0;
|
||
|
||
if(!cpus_flag)
|
||
{
|
||
tmp_group_func_addr = PIO_REG_CFG(port, port_num_func); //<2F><><EFBFBD>¹<EFBFBD><C2B9>ܼĴ<DCBC><C4B4><EFBFBD><EFBFBD><EFBFBD>ַ
|
||
tmp_group_pull_addr = PIO_REG_PULL(port, port_num_pull); //<2F><><EFBFBD><EFBFBD>pull<6C>Ĵ<EFBFBD><C4B4><EFBFBD>
|
||
tmp_group_dlevel_addr = PIO_REG_DLEVEL(port, port_num_pull);//<2F><><EFBFBD><EFBFBD>level<65>Ĵ<EFBFBD><C4B4><EFBFBD>
|
||
tmp_group_data_addr = PIO_REG_DATA(port); //<2F><><EFBFBD><EFBFBD>data<74>Ĵ<EFBFBD><C4B4><EFBFBD>
|
||
}
|
||
else
|
||
{
|
||
tmp_group_func_addr = R_PIO_REG_CFG(port, port_num_func); //<2F><><EFBFBD>¹<EFBFBD><C2B9>ܼĴ<DCBC><C4B4><EFBFBD><EFBFBD><EFBFBD>ַ
|
||
tmp_group_pull_addr = R_PIO_REG_PULL(port, port_num_pull); //<2F><><EFBFBD><EFBFBD>pull<6C>Ĵ<EFBFBD><C4B4><EFBFBD>
|
||
tmp_group_dlevel_addr = R_PIO_REG_DLEVEL(port, port_num_pull);//<2F><><EFBFBD><EFBFBD>level<65>Ĵ<EFBFBD><C4B4><EFBFBD>
|
||
tmp_group_data_addr = R_PIO_REG_DATA(port); //<2F><><EFBFBD><EFBFBD>data<74>Ĵ<EFBFBD><C4B4><EFBFBD>
|
||
}
|
||
tmp_group_func_data = GPIO_REG_READ(tmp_group_func_addr);
|
||
tmp_group_pull_data = GPIO_REG_READ(tmp_group_pull_addr);
|
||
tmp_group_dlevel_data = GPIO_REG_READ(tmp_group_dlevel_addr);
|
||
tmp_group_data_data = GPIO_REG_READ(tmp_group_data_addr);
|
||
}
|
||
break;
|
||
}
|
||
if(first_port >= group_count_max)
|
||
{
|
||
return 0;
|
||
}
|
||
//<2F><><EFBFBD><EFBFBD><EFBFBD>û<EFBFBD><C3BB><EFBFBD><EFBFBD><EFBFBD>
|
||
for(i = first_port; i < group_count_max; i++)
|
||
{
|
||
tmp_sys_gpio_data = user_gpio_set + i; //tmp_sys_gpio_dataָ<61><D6B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>GPIO<49>ռ<EFBFBD>
|
||
tmp_user_gpio_data = gpio_list + i; //gpio_set<65><74><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8><EFBFBD>û<EFBFBD><C3BB><EFBFBD>ÿ<EFBFBD><C3BF>GPIO<49><4F><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ա
|
||
port = tmp_user_gpio_data->port; //<2F><><EFBFBD><EFBFBD><EFBFBD>˿<EFBFBD><CBBF><EFBFBD>ֵ
|
||
port_num = tmp_user_gpio_data->port_num; //<2F><><EFBFBD><EFBFBD><EFBFBD>˿<EFBFBD><CBBF>е<EFBFBD>ijһ<C4B3><D2BB>GPIO
|
||
if(!port)
|
||
{
|
||
continue;
|
||
}
|
||
|
||
port_num_func = (port_num >> 3);
|
||
port_num_pull = (port_num >> 4);
|
||
|
||
if(port >= 12)
|
||
{
|
||
cpus_flag = 1;
|
||
}
|
||
else
|
||
{
|
||
cpus_flag = 0;
|
||
}
|
||
|
||
//<2F><>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD><EFBFBD>û<EFBFBD><C3BB><EFBFBD><EFBFBD><EFBFBD>
|
||
strcpy(tmp_sys_gpio_data->gpio_name, tmp_user_gpio_data->gpio_name);
|
||
tmp_sys_gpio_data->port = port;
|
||
tmp_sys_gpio_data->port_num = port_num;
|
||
tmp_sys_gpio_data->user_gpio_status.mul_sel = tmp_user_gpio_data->mul_sel;
|
||
tmp_sys_gpio_data->user_gpio_status.pull = tmp_user_gpio_data->pull;
|
||
tmp_sys_gpio_data->user_gpio_status.drv_level = tmp_user_gpio_data->drv_level;
|
||
tmp_sys_gpio_data->user_gpio_status.data = tmp_user_gpio_data->data;
|
||
|
||
if((port_num_pull != pre_port_num_pull) || (port != pre_port) || (pre_port == 0xffff)) //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ<EFBFBD>ǰ<EFBFBD><C7B0><EFBFBD>ŵĶ˿ڲ<CBBF>һ<EFBFBD>£<EFBFBD><C2A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڵ<EFBFBD>pull<6C>Ĵ<EFBFBD><C4B4><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB>
|
||
{
|
||
if(pre_port == 0xffff)
|
||
{
|
||
if(data_change)
|
||
{
|
||
data_change = 0;
|
||
gpio_set_axpgpio_value(0, pre_port_num, tmp_group_data_data);
|
||
}
|
||
}
|
||
else
|
||
{
|
||
if(func_change)
|
||
{
|
||
GPIO_REG_WRITE(tmp_group_func_addr, tmp_group_func_data); //<2F><>д<EFBFBD><D0B4><EFBFBD>ܼĴ<DCBC><C4B4><EFBFBD>
|
||
func_change = 0;
|
||
}
|
||
if(pull_change)
|
||
{
|
||
pull_change = 0;
|
||
GPIO_REG_WRITE(tmp_group_pull_addr, tmp_group_pull_data); //<2F><>дpull<6C>Ĵ<EFBFBD><C4B4><EFBFBD>
|
||
}
|
||
if(dlevel_change)
|
||
{
|
||
dlevel_change = 0;
|
||
GPIO_REG_WRITE(tmp_group_dlevel_addr, tmp_group_dlevel_data); //<2F><>дdriver level<65>Ĵ<EFBFBD><C4B4><EFBFBD>
|
||
}
|
||
if(data_change)
|
||
{
|
||
data_change = 0;
|
||
GPIO_REG_WRITE(tmp_group_data_addr, tmp_group_data_data); //<2F><>д
|
||
}
|
||
}
|
||
|
||
if(port == 0xffff)
|
||
{
|
||
tmp_group_data_data = tmp_user_gpio_data->data;
|
||
data_change = 1;
|
||
}
|
||
else
|
||
{
|
||
if(!cpus_flag)
|
||
{
|
||
tmp_group_func_addr = PIO_REG_CFG(port, port_num_func); //<2F><><EFBFBD>¹<EFBFBD><C2B9>ܼĴ<DCBC><C4B4><EFBFBD><EFBFBD><EFBFBD>ַ
|
||
tmp_group_pull_addr = PIO_REG_PULL(port, port_num_pull); //<2F><><EFBFBD><EFBFBD>pull<6C>Ĵ<EFBFBD><C4B4><EFBFBD>
|
||
tmp_group_dlevel_addr = PIO_REG_DLEVEL(port, port_num_pull); //<2F><><EFBFBD><EFBFBD>level<65>Ĵ<EFBFBD><C4B4><EFBFBD>
|
||
tmp_group_data_addr = PIO_REG_DATA(port); //<2F><><EFBFBD><EFBFBD>data<74>Ĵ<EFBFBD><C4B4><EFBFBD>
|
||
}
|
||
else
|
||
{
|
||
|
||
tmp_group_func_addr = R_PIO_REG_CFG(port, port_num_func); //<2F><><EFBFBD>¹<EFBFBD><C2B9>ܼĴ<DCBC><C4B4><EFBFBD><EFBFBD><EFBFBD>ַ
|
||
tmp_group_pull_addr = R_PIO_REG_PULL(port, port_num_pull); //<2F><><EFBFBD><EFBFBD>pull<6C>Ĵ<EFBFBD>??
|
||
tmp_group_dlevel_addr = R_PIO_REG_DLEVEL(port, port_num_pull); //<2F><><EFBFBD><EFBFBD>level<65>Ĵ<EFBFBD><C4B4><EFBFBD>
|
||
tmp_group_data_addr = R_PIO_REG_DATA(port); //<2F><><EFBFBD><EFBFBD>data<74>Ĵ<EFBFBD><C4B4><EFBFBD>
|
||
}
|
||
tmp_group_func_data = GPIO_REG_READ(tmp_group_func_addr);
|
||
tmp_group_pull_data = GPIO_REG_READ(tmp_group_pull_addr);
|
||
tmp_group_dlevel_data = GPIO_REG_READ(tmp_group_dlevel_addr);
|
||
tmp_group_data_data = GPIO_REG_READ(tmp_group_data_addr);
|
||
}
|
||
}
|
||
else if(pre_port_num_func != port_num_func) //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ<EFBFBD>ǰ<EFBFBD><C7B0><EFBFBD>ŵĹ<C5B5><C4B9>ܼĴ<DCBC><C4B4><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB>
|
||
{
|
||
if(pre_port == 0xffff)
|
||
{
|
||
gpio_set_axpgpio_value(0, pre_port_num, tmp_group_data_data);
|
||
}
|
||
else
|
||
{
|
||
GPIO_REG_WRITE(tmp_group_func_addr, tmp_group_func_data); //<2F><>ֻ<EFBFBD><D6BB>д<EFBFBD><D0B4><EFBFBD>ܼĴ<DCBC><C4B4><EFBFBD>
|
||
}
|
||
|
||
if(port == 0xffff)
|
||
{
|
||
tmp_group_data_data = tmp_user_gpio_data->data;
|
||
data_change = 1;
|
||
}
|
||
else
|
||
{
|
||
if(!cpus_flag)
|
||
{
|
||
tmp_group_func_addr = PIO_REG_CFG(port, port_num_func); //<2F><><EFBFBD>¹<EFBFBD><C2B9>ܼĴ<DCBC><C4B4><EFBFBD><EFBFBD><EFBFBD>ַ
|
||
}
|
||
else
|
||
{
|
||
tmp_group_func_addr = R_PIO_REG_CFG(port, port_num_func); //<2F><><EFBFBD>¹<EFBFBD><C2B9>ܼĴ<DCBC><C4B4><EFBFBD><EFBFBD><EFBFBD>ַ
|
||
}
|
||
tmp_group_func_data = GPIO_REG_READ(tmp_group_func_addr);
|
||
}
|
||
}
|
||
//<2F><><EFBFBD>浱ǰӲ<C7B0><D3B2><EFBFBD>Ĵ<EFBFBD><C4B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||
pre_port_num_pull = port_num_pull; //<2F><><EFBFBD>õ<EFBFBD>ǰGPIO<49><4F>Ϊǰһ<C7B0><D2BB>GPIO
|
||
pre_port_num_func = port_num_func;
|
||
pre_port = port;
|
||
pre_port_num = port_num;
|
||
|
||
if(port == 0xffff)
|
||
{
|
||
if(tmp_user_gpio_data->data >= 0)
|
||
{
|
||
tmp_group_data_data = tmp_user_gpio_data->data;
|
||
data_change = 1;
|
||
}
|
||
}
|
||
else
|
||
{
|
||
//<2F><><EFBFBD>¹<EFBFBD><C2B9>ܼĴ<DCBC><C4B4><EFBFBD>
|
||
if(tmp_user_gpio_data->mul_sel >= 0)
|
||
{
|
||
tmp_val = (port_num - (port_num_func<<3)) << 2;
|
||
tmp_sys_gpio_data->hardware_gpio_status.mul_sel = (tmp_group_func_data >> tmp_val) & 0x07;
|
||
tmp_group_func_data &= ~( 0x07 << tmp_val);
|
||
tmp_group_func_data |= (tmp_user_gpio_data->mul_sel & 0x07) << tmp_val;
|
||
func_change = 1;
|
||
}
|
||
//<2F><><EFBFBD><EFBFBD>pull<6C><6C>ֵ<EFBFBD><D6B5><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD><EFBFBD>pull<6C>Ĵ<EFBFBD><C4B4><EFBFBD>
|
||
|
||
tmp_val = (port_num - (port_num_pull<<4)) << 1;
|
||
|
||
if(tmp_user_gpio_data->pull >= 0)
|
||
{
|
||
tmp_sys_gpio_data->hardware_gpio_status.pull = (tmp_group_pull_data >> tmp_val) & 0x03;
|
||
if(tmp_user_gpio_data->pull >= 0)
|
||
{
|
||
tmp_group_pull_data &= ~( 0x03 << tmp_val);
|
||
tmp_group_pull_data |= (tmp_user_gpio_data->pull & 0x03) << tmp_val;
|
||
pull_change = 1;
|
||
}
|
||
}
|
||
//<2F><><EFBFBD><EFBFBD>driver level<65><6C>ֵ<EFBFBD><D6B5><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD><EFBFBD>driver level<65>Ĵ<EFBFBD><C4B4><EFBFBD>
|
||
if(tmp_user_gpio_data->drv_level >= 0)
|
||
{
|
||
tmp_sys_gpio_data->hardware_gpio_status.drv_level = (tmp_group_dlevel_data >> tmp_val) & 0x03;
|
||
if(tmp_user_gpio_data->drv_level >= 0)
|
||
{
|
||
tmp_group_dlevel_data &= ~( 0x03 << tmp_val);
|
||
tmp_group_dlevel_data |= (tmp_user_gpio_data->drv_level & 0x03) << tmp_val;
|
||
dlevel_change = 1;
|
||
}
|
||
}
|
||
//<2F><><EFBFBD><EFBFBD><EFBFBD>û<EFBFBD><C3BB><EFBFBD><EFBFBD>룬<EFBFBD>Լ<EFBFBD><D4BC><EFBFBD><EFBFBD>ܷ<EFBFBD><DCB7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD><EFBFBD>data<74>Ĵ<EFBFBD><C4B4><EFBFBD>
|
||
if(tmp_user_gpio_data->mul_sel == 1)
|
||
{
|
||
if(tmp_user_gpio_data->data >= 0)
|
||
{
|
||
tmp_val = tmp_user_gpio_data->data;
|
||
tmp_val &= 1;
|
||
tmp_group_data_data &= ~(1 << port_num);
|
||
tmp_group_data_data |= tmp_val << port_num;
|
||
data_change = 1;
|
||
}
|
||
}
|
||
}
|
||
}
|
||
|
||
//forѭ<72><D1AD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڻ<EFBFBD>û<EFBFBD>л<EFBFBD>д<EFBFBD>ļĴ<C4BC><C4B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>д<EFBFBD>ص<EFBFBD>Ӳ<EFBFBD><D3B2><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||
if(port == 0xffff)
|
||
{
|
||
if(data_change)
|
||
{
|
||
gpio_set_axpgpio_value(0, port_num, tmp_group_data_data);
|
||
}
|
||
}
|
||
else
|
||
{
|
||
if(tmp_group_func_addr) //ֻҪ<D6BB><D2AA><EFBFBD>¹<EFBFBD><C2B9>Ĵ<EFBFBD><C4B4><EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD>Ϳ<EFBFBD><CDBF>Զ<EFBFBD>Ӳ<EFBFBD><D3B2><EFBFBD><EFBFBD>ֵ
|
||
{ //<2F><>ô<EFBFBD><C3B4><EFBFBD><EFBFBD><EFBFBD>е<EFBFBD>ֵȫ<D6B5><C8AB><EFBFBD><EFBFBD>д<EFBFBD><D0B4>Ӳ<EFBFBD><D3B2><EFBFBD>Ĵ<EFBFBD><C4B4><EFBFBD>
|
||
GPIO_REG_WRITE(tmp_group_func_addr, tmp_group_func_data); //<2F><>д<EFBFBD><D0B4><EFBFBD>ܼĴ<DCBC><C4B4><EFBFBD>
|
||
if(pull_change)
|
||
{
|
||
GPIO_REG_WRITE(tmp_group_pull_addr, tmp_group_pull_data); //<2F><>дpull<6C>Ĵ<EFBFBD><C4B4><EFBFBD>
|
||
}
|
||
if(dlevel_change)
|
||
{
|
||
GPIO_REG_WRITE(tmp_group_dlevel_addr, tmp_group_dlevel_data); //<2F><>дdriver level<65>Ĵ<EFBFBD><C4B4><EFBFBD>
|
||
}
|
||
if(data_change)
|
||
{
|
||
GPIO_REG_WRITE(tmp_group_data_addr, tmp_group_data_data); //<2F><>дdata<74>Ĵ<EFBFBD><C4B4><EFBFBD>
|
||
}
|
||
}
|
||
}
|
||
return (u32)user_gpio_buf;
|
||
}
|
||
|
||
#else //֧<><D6A7>û<EFBFBD><C3BB>CPUSƽ̨<C6BD><CCA8>gpio<69><6F><EFBFBD><EFBFBD>
|
||
|
||
u32 gpio_request(user_gpio_set_t *gpio_list, __u32 group_count_max)
|
||
{
|
||
char *user_gpio_buf; //<2F><><EFBFBD><EFBFBD>char<61><72><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||
system_gpio_set_t *user_gpio_set, *tmp_sys_gpio_data; //user_gpio_set<65><74><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڴ<EFBFBD><DAB4>ľ<EFBFBD><C4BE><EFBFBD>
|
||
user_gpio_set_t *tmp_user_gpio_data;
|
||
__u32 real_gpio_count = 0, first_port; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ч<EFBFBD><D0A7>GPIO<49>ĸ<EFBFBD><C4B8><EFBFBD>
|
||
__u32 tmp_group_func_data = 0;
|
||
__u32 tmp_group_pull_data = 0;
|
||
__u32 tmp_group_dlevel_data = 0;
|
||
__u32 tmp_group_data_data = 0;
|
||
__u32 func_change = 0, pull_change = 0;
|
||
__u32 dlevel_change = 0, data_change = 0;
|
||
volatile __u32 *tmp_group_func_addr = NULL, *tmp_group_pull_addr = NULL;
|
||
volatile __u32 *tmp_group_dlevel_addr = NULL, *tmp_group_data_addr = NULL;
|
||
__u32 port, port_num, port_num_func, port_num_pull;
|
||
__u32 pre_port = 0x7fffffff, pre_port_num_func = 0x7fffffff;
|
||
__u32 pre_port_num_pull = 0x7fffffff;
|
||
__s32 i, tmp_val;
|
||
if((!gpio_list) || (!group_count_max))
|
||
{
|
||
return (u32)0;
|
||
}
|
||
for(i = 0; i < group_count_max; i++)
|
||
{
|
||
tmp_user_gpio_data = gpio_list + i; //gpio_set<65><74><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8>ÿ<EFBFBD><C3BF>GPIO<49><4F><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ա
|
||
if(!tmp_user_gpio_data->port)
|
||
{
|
||
continue;
|
||
}
|
||
real_gpio_count ++;
|
||
}
|
||
|
||
//SYSCONFIG_DEBUG("to malloc space for pin \n");
|
||
user_gpio_buf = (char *)malloc(16 + sizeof(system_gpio_set_t) * real_gpio_count); //<2F><><EFBFBD><EFBFBD><EFBFBD>ڴ棬<DAB4><E6A3AC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>16<31><36><EFBFBD>ֽڣ<D6BD><DAA3><EFBFBD><EFBFBD>ڴ<EFBFBD><DAB4><EFBFBD>GPIO<49><4F><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ
|
||
if(!user_gpio_buf)
|
||
{
|
||
return (u32)0;
|
||
}
|
||
memset(user_gpio_buf, 0, 16 + sizeof(system_gpio_set_t) * real_gpio_count); //<2F><><EFBFBD><EFBFBD>ȫ<EFBFBD><C8AB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||
*(int *)user_gpio_buf = real_gpio_count; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ч<EFBFBD><D0A7>GPIO<49><4F><EFBFBD><EFBFBD>
|
||
user_gpio_set = (system_gpio_set_t *)(user_gpio_buf + 16); //ָ<><D6B8><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD>ṹ<EFBFBD><E1B9B9>
|
||
//<><D7BC><EFBFBD><EFBFBD>һ<EFBFBD><D2BB>GPIO<49><4F><EFBFBD><EFBFBD>
|
||
for(first_port = 0; first_port < group_count_max; first_port++)
|
||
{
|
||
tmp_user_gpio_data = gpio_list + first_port;
|
||
port = tmp_user_gpio_data->port; //<2F><><EFBFBD><EFBFBD><EFBFBD>˿<EFBFBD><CBBF><EFBFBD>ֵ
|
||
port_num = tmp_user_gpio_data->port_num; //<2F><><EFBFBD><EFBFBD><EFBFBD>˿<EFBFBD><CBBF>е<EFBFBD>ijһ<C4B3><D2BB>GPIO
|
||
if(!port)
|
||
{
|
||
continue;
|
||
}
|
||
port_num_func = (port_num >> 3);
|
||
port_num_pull = (port_num >> 4);
|
||
|
||
tmp_group_func_addr = PIO_REG_CFG(port, port_num_func); //<2F><><EFBFBD>¹<EFBFBD><C2B9>ܼĴ<DCBC><C4B4><EFBFBD><EFBFBD><EFBFBD>ַ
|
||
tmp_group_pull_addr = PIO_REG_PULL(port, port_num_pull); //<2F><><EFBFBD><EFBFBD>pull<6C>Ĵ<EFBFBD><C4B4><EFBFBD>
|
||
tmp_group_dlevel_addr = PIO_REG_DLEVEL(port, port_num_pull);//<2F><><EFBFBD><EFBFBD>level<65>Ĵ<EFBFBD><C4B4><EFBFBD>
|
||
tmp_group_data_addr = PIO_REG_DATA(port); //<2F><><EFBFBD><EFBFBD>data<74>Ĵ<EFBFBD><C4B4><EFBFBD>
|
||
|
||
tmp_group_func_data = GPIO_REG_READ(tmp_group_func_addr);
|
||
tmp_group_pull_data = GPIO_REG_READ(tmp_group_pull_addr);
|
||
tmp_group_dlevel_data = GPIO_REG_READ(tmp_group_dlevel_addr);
|
||
tmp_group_data_data = GPIO_REG_READ(tmp_group_data_addr);
|
||
break;
|
||
}
|
||
if(first_port >= group_count_max)
|
||
{
|
||
return 0;
|
||
}
|
||
//<2F><><EFBFBD><EFBFBD><EFBFBD>û<EFBFBD><C3BB><EFBFBD><EFBFBD><EFBFBD>
|
||
for(i = first_port; i < group_count_max; i++)
|
||
{
|
||
tmp_sys_gpio_data = user_gpio_set + i; //tmp_sys_gpio_dataָ<61><D6B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>GPIO<49>ռ<EFBFBD>
|
||
tmp_user_gpio_data = gpio_list + i; //gpio_set<65><74><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8><EFBFBD>û<EFBFBD><C3BB><EFBFBD>ÿ<EFBFBD><C3BF>GPIO<49><4F><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ա
|
||
port = tmp_user_gpio_data->port; //<2F><><EFBFBD><EFBFBD><EFBFBD>˿<EFBFBD><CBBF><EFBFBD>ֵ
|
||
port_num = tmp_user_gpio_data->port_num; //<2F><><EFBFBD><EFBFBD><EFBFBD>˿<EFBFBD><CBBF>е<EFBFBD>ijһ<C4B3><D2BB>GPIO
|
||
if(!port)
|
||
{
|
||
continue;
|
||
}
|
||
//<2F><>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD><EFBFBD>û<EFBFBD><C3BB><EFBFBD><EFBFBD><EFBFBD>
|
||
strcpy(tmp_sys_gpio_data->gpio_name, tmp_user_gpio_data->gpio_name);
|
||
tmp_sys_gpio_data->port = port;
|
||
tmp_sys_gpio_data->port_num = port_num;
|
||
tmp_sys_gpio_data->user_gpio_status.mul_sel = tmp_user_gpio_data->mul_sel;
|
||
tmp_sys_gpio_data->user_gpio_status.pull = tmp_user_gpio_data->pull;
|
||
tmp_sys_gpio_data->user_gpio_status.drv_level = tmp_user_gpio_data->drv_level;
|
||
tmp_sys_gpio_data->user_gpio_status.data = tmp_user_gpio_data->data;
|
||
|
||
port_num_func = (port_num >> 3);
|
||
port_num_pull = (port_num >> 4);
|
||
|
||
if((port_num_pull != pre_port_num_pull) || (port != pre_port)) //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ<EFBFBD>ǰ<EFBFBD><C7B0><EFBFBD>ŵĶ˿ڲ<CBBF>һ<EFBFBD>£<EFBFBD><C2A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڵ<EFBFBD>pull<6C>Ĵ<EFBFBD><C4B4><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB>
|
||
{
|
||
if(func_change)
|
||
{
|
||
GPIO_REG_WRITE(tmp_group_func_addr, tmp_group_func_data); //<2F><>д<EFBFBD><D0B4><EFBFBD>ܼĴ<DCBC><C4B4><EFBFBD>
|
||
func_change = 0;
|
||
}
|
||
if(pull_change)
|
||
{
|
||
pull_change = 0;
|
||
GPIO_REG_WRITE(tmp_group_pull_addr, tmp_group_pull_data); //<2F><>дpull<6C>Ĵ<EFBFBD><C4B4><EFBFBD>
|
||
}
|
||
if(dlevel_change)
|
||
{
|
||
dlevel_change = 0;
|
||
GPIO_REG_WRITE(tmp_group_dlevel_addr, tmp_group_dlevel_data); //<2F><>дdriver level<65>Ĵ<EFBFBD><C4B4><EFBFBD>
|
||
}
|
||
if(data_change)
|
||
{
|
||
data_change = 0;
|
||
GPIO_REG_WRITE(tmp_group_data_addr, tmp_group_data_data); //<2F><>д
|
||
}
|
||
|
||
tmp_group_func_addr = PIO_REG_CFG(port, port_num_func); //<2F><><EFBFBD>¹<EFBFBD><C2B9>ܼĴ<DCBC><C4B4><EFBFBD><EFBFBD><EFBFBD>ַ
|
||
tmp_group_pull_addr = PIO_REG_PULL(port, port_num_pull); //<2F><><EFBFBD><EFBFBD>pull<6C>Ĵ<EFBFBD><C4B4><EFBFBD>
|
||
tmp_group_dlevel_addr = PIO_REG_DLEVEL(port, port_num_pull); //<2F><><EFBFBD><EFBFBD>level<65>Ĵ<EFBFBD><C4B4><EFBFBD>
|
||
tmp_group_data_addr = PIO_REG_DATA(port); //<2F><><EFBFBD><EFBFBD>data<74>Ĵ<EFBFBD><C4B4><EFBFBD>
|
||
|
||
tmp_group_func_data = GPIO_REG_READ(tmp_group_func_addr);
|
||
tmp_group_pull_data = GPIO_REG_READ(tmp_group_pull_addr);
|
||
tmp_group_dlevel_data = GPIO_REG_READ(tmp_group_dlevel_addr);
|
||
tmp_group_data_data = GPIO_REG_READ(tmp_group_data_addr);
|
||
|
||
}
|
||
else if(pre_port_num_func != port_num_func) //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ<EFBFBD>ǰ<EFBFBD><C7B0><EFBFBD>ŵĹ<C5B5><C4B9>ܼĴ<DCBC><C4B4><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB>
|
||
{
|
||
GPIO_REG_WRITE(tmp_group_func_addr, tmp_group_func_data); //<2F><>ֻ<EFBFBD><D6BB>д<EFBFBD><D0B4><EFBFBD>ܼĴ<DCBC><C4B4><EFBFBD>
|
||
|
||
tmp_group_func_addr = PIO_REG_CFG(port, port_num_func); //<2F><><EFBFBD>¹<EFBFBD><C2B9>ܼĴ<DCBC><C4B4><EFBFBD><EFBFBD><EFBFBD>ַ
|
||
|
||
tmp_group_func_data = GPIO_REG_READ(tmp_group_func_addr);
|
||
}
|
||
//<2F><><EFBFBD>浱ǰӲ<C7B0><D3B2><EFBFBD>Ĵ<EFBFBD><C4B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||
pre_port_num_pull = port_num_pull; //<2F><><EFBFBD>õ<EFBFBD>ǰGPIO<49><4F>Ϊǰһ<C7B0><D2BB>GPIO
|
||
pre_port_num_func = port_num_func;
|
||
pre_port = port;
|
||
|
||
//<2F><><EFBFBD>¹<EFBFBD><C2B9>ܼĴ<DCBC><C4B4><EFBFBD>
|
||
if(tmp_user_gpio_data->mul_sel >= 0)
|
||
{
|
||
tmp_val = (port_num - (port_num_func<<3)) << 2;
|
||
tmp_sys_gpio_data->hardware_gpio_status.mul_sel = (tmp_group_func_data >> tmp_val) & 0x07;
|
||
tmp_group_func_data &= ~( 0x07 << tmp_val);
|
||
tmp_group_func_data |= (tmp_user_gpio_data->mul_sel & 0x07) << tmp_val;
|
||
func_change = 1;
|
||
}
|
||
//<2F><><EFBFBD><EFBFBD>pull<6C><6C>ֵ<EFBFBD><D6B5><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD><EFBFBD>pull<6C>Ĵ<EFBFBD><C4B4><EFBFBD>
|
||
|
||
tmp_val = (port_num - (port_num_pull<<4)) << 1;
|
||
|
||
if(tmp_user_gpio_data->pull >= 0)
|
||
{
|
||
tmp_sys_gpio_data->hardware_gpio_status.pull = (tmp_group_pull_data >> tmp_val) & 0x03;
|
||
if(tmp_user_gpio_data->pull >= 0)
|
||
{
|
||
tmp_group_pull_data &= ~( 0x03 << tmp_val);
|
||
tmp_group_pull_data |= (tmp_user_gpio_data->pull & 0x03) << tmp_val;
|
||
pull_change = 1;
|
||
}
|
||
}
|
||
//<2F><><EFBFBD><EFBFBD>driver level<65><6C>ֵ<EFBFBD><D6B5><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD><EFBFBD>driver level<65>Ĵ<EFBFBD><C4B4><EFBFBD>
|
||
if(tmp_user_gpio_data->drv_level >= 0)
|
||
{
|
||
tmp_sys_gpio_data->hardware_gpio_status.drv_level = (tmp_group_dlevel_data >> tmp_val) & 0x03;
|
||
if(tmp_user_gpio_data->drv_level >= 0)
|
||
{
|
||
tmp_group_dlevel_data &= ~( 0x03 << tmp_val);
|
||
tmp_group_dlevel_data |= (tmp_user_gpio_data->drv_level & 0x03) << tmp_val;
|
||
dlevel_change = 1;
|
||
}
|
||
}
|
||
//<2F><><EFBFBD><EFBFBD><EFBFBD>û<EFBFBD><C3BB><EFBFBD><EFBFBD>룬<EFBFBD>Լ<EFBFBD><D4BC><EFBFBD><EFBFBD>ܷ<EFBFBD><DCB7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD><EFBFBD>data<74>Ĵ<EFBFBD><C4B4><EFBFBD>
|
||
if(tmp_user_gpio_data->mul_sel == 1)
|
||
{
|
||
if(tmp_user_gpio_data->data >= 0)
|
||
{
|
||
tmp_val = tmp_user_gpio_data->data;
|
||
tmp_val &= 1;
|
||
tmp_group_data_data &= ~(1 << port_num);
|
||
tmp_group_data_data |= tmp_val << port_num;
|
||
data_change = 1;
|
||
}
|
||
}
|
||
}
|
||
|
||
//forѭ<72><D1AD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڻ<EFBFBD>û<EFBFBD>л<EFBFBD>д<EFBFBD>ļĴ<C4BC><C4B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>д<EFBFBD>ص<EFBFBD>Ӳ<EFBFBD><D3B2><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||
if(tmp_group_func_addr) //ֻҪ<D6BB><D2AA><EFBFBD>¹<EFBFBD><C2B9>Ĵ<EFBFBD><C4B4><EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD>Ϳ<EFBFBD><CDBF>Զ<EFBFBD>Ӳ<EFBFBD><D3B2><EFBFBD><EFBFBD>ֵ
|
||
{ //<2F><>ô<EFBFBD><C3B4><EFBFBD><EFBFBD><EFBFBD>е<EFBFBD>ֵȫ<D6B5><C8AB><EFBFBD><EFBFBD>д<EFBFBD><D0B4>Ӳ<EFBFBD><D3B2><EFBFBD>Ĵ<EFBFBD><C4B4><EFBFBD>
|
||
GPIO_REG_WRITE(tmp_group_func_addr, tmp_group_func_data); //<2F><>д<EFBFBD><D0B4><EFBFBD>ܼĴ<DCBC><C4B4><EFBFBD>
|
||
if(pull_change)
|
||
{
|
||
GPIO_REG_WRITE(tmp_group_pull_addr, tmp_group_pull_data); //<2F><>дpull<6C>Ĵ<EFBFBD><C4B4><EFBFBD>
|
||
}
|
||
if(dlevel_change)
|
||
{
|
||
GPIO_REG_WRITE(tmp_group_dlevel_addr, tmp_group_dlevel_data); //<2F><>дdriver level<65>Ĵ<EFBFBD><C4B4><EFBFBD>
|
||
}
|
||
if(data_change)
|
||
{
|
||
GPIO_REG_WRITE(tmp_group_data_addr, tmp_group_data_data); //<2F><>дdata<74>Ĵ<EFBFBD><C4B4><EFBFBD>
|
||
}
|
||
}
|
||
return (u32)user_gpio_buf;
|
||
}
|
||
#endif
|
||
/*
|
||
************************************************************************************************************
|
||
*
|
||
* gpio_request_ex
|
||
*
|
||
* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƣ<EFBFBD>
|
||
*
|
||
* <20><><EFBFBD><EFBFBD>˵<EFBFBD><CBB5>: main_name <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƣ<EFBFBD>ƥ<EFBFBD><C6A5>ģ<EFBFBD><C4A3>(<28><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)
|
||
*
|
||
* sub_name <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ӽ<EFBFBD><D3BC><EFBFBD><EFBFBD>ƣ<EFBFBD><C6A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ǿգ<C7BF><D5A3><EFBFBD>ʾȫ<CABE><C8AB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ѱ<EFBFBD>ҵ<EFBFBD>ƥ<EFBFBD><C6A5><EFBFBD>ĵ<EFBFBD><C4B5><EFBFBD>GPIO
|
||
*
|
||
* <20><><EFBFBD><EFBFBD>ֵ <20><>0 : err
|
||
* other: success
|
||
*
|
||
* ˵<><CBB5> <20><><EFBFBD><EFBFBD>ʱû<CAB1><C3BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͻ<EFBFBD><CDBB><EFBFBD><EFBFBD>
|
||
*
|
||
*
|
||
************************************************************************************************************
|
||
*/
|
||
u32 gpio_request_ex(char *main_name, const char *sub_name) //<2F>豸<EFBFBD><E8B1B8><EFBFBD><EFBFBD>GPIO<49><4F><EFBFBD><EFBFBD><EFBFBD><EFBFBD>չ<EFBFBD>ӿ<EFBFBD>
|
||
{
|
||
user_gpio_set_t *gpio_list=NULL;
|
||
user_gpio_set_t one_gpio;
|
||
__u32 gpio_handle;
|
||
__s32 gpio_count;
|
||
|
||
if(!sub_name){
|
||
gpio_count = script_parser_mainkey_get_gpio_count(main_name);
|
||
if(gpio_count <= 0)
|
||
{
|
||
/*printf("err: gpio count < =0 ,gpio_count is: %d \n", gpio_count);*/
|
||
return 0;
|
||
}
|
||
gpio_list = (user_gpio_set_t *)malloc(sizeof(system_gpio_set_t) * gpio_count); //<2F><><EFBFBD><EFBFBD>һƬ<D2BB><C6AC>ʱ<EFBFBD>ڴ棬<DAB4><E6A3AC><EFBFBD>ڱ<EFBFBD><DAB1><EFBFBD><EFBFBD>û<EFBFBD><C3BB><EFBFBD><EFBFBD><EFBFBD>
|
||
if(!gpio_list){
|
||
/* printf("malloc gpio_list error \n");*/
|
||
return 0;
|
||
}
|
||
if(!script_parser_mainkey_get_gpio_cfg(main_name,gpio_list,gpio_count)){
|
||
gpio_handle = gpio_request(gpio_list, gpio_count);
|
||
free(gpio_list);
|
||
|
||
}else{
|
||
return 0;
|
||
}
|
||
}else{
|
||
if(script_parser_fetch((char *)main_name, (char *)sub_name, (int *)&one_gpio, (sizeof(user_gpio_set_t) >> 2)) < 0){
|
||
/* printf("script parser fetch err. \n");*/
|
||
return 0;
|
||
}
|
||
|
||
gpio_handle = gpio_request(&one_gpio, 1);
|
||
}
|
||
|
||
return gpio_handle;
|
||
}
|
||
/*
|
||
************************************************************************************************************
|
||
*
|
||
* gpio_request_simple
|
||
*
|
||
* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƣ<EFBFBD>
|
||
*
|
||
* <20><><EFBFBD><EFBFBD>˵<EFBFBD><CBB5>: main_name <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƣ<EFBFBD>ƥ<EFBFBD><C6A5>ģ<EFBFBD><C4A3>(<28><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)
|
||
*
|
||
* sub_name <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ӽ<EFBFBD><D3BC><EFBFBD><EFBFBD>ƣ<EFBFBD><C6A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ǿգ<C7BF><D5A3><EFBFBD>ʾȫ<CABE><C8AB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ѱ<EFBFBD>ҵ<EFBFBD>ƥ<EFBFBD><C6A5><EFBFBD>ĵ<EFBFBD><C4B5><EFBFBD>GPIO
|
||
*
|
||
* <20><><EFBFBD><EFBFBD>ֵ <20><>0 : err
|
||
* other: success
|
||
*
|
||
* ˵<><CBB5> <20><><EFBFBD><EFBFBD>ʱû<CAB1><C3BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͻ<EFBFBD><CDBB><EFBFBD><EFBFBD>
|
||
*
|
||
*
|
||
************************************************************************************************************
|
||
*/
|
||
int gpio_request_simple(char *main_name, const char *sub_name) //<2F>豸<EFBFBD><E8B1B8><EFBFBD><EFBFBD>GPIO<49><4F><EFBFBD><EFBFBD><EFBFBD><EFBFBD>չ<EFBFBD>ӿ<EFBFBD>
|
||
{
|
||
user_gpio_set_t gpio_list[16];
|
||
__s32 gpio_count;
|
||
int ret = -1;
|
||
|
||
if(!sub_name)
|
||
{
|
||
gpio_count = script_parser_mainkey_get_gpio_count(main_name);
|
||
if(gpio_count <= 0)
|
||
{
|
||
printf("err: gpio count < =0 ,gpio_count is: %d \n", gpio_count);
|
||
return -1;
|
||
}
|
||
memset(gpio_list, 0, 16 * sizeof(user_gpio_set_t));
|
||
if(!script_parser_mainkey_get_gpio_cfg(main_name, gpio_list, gpio_count))
|
||
{
|
||
ret = gpio_request_early(gpio_list, gpio_count, 1);
|
||
}
|
||
}
|
||
else
|
||
{
|
||
if(script_parser_fetch((char *)main_name, (char *)sub_name, (int *)gpio_list, (sizeof(user_gpio_set_t) >> 2)) < 0)
|
||
{
|
||
printf("script parser fetch err. \n");
|
||
return 0;
|
||
}
|
||
|
||
ret = gpio_request_early(gpio_list, 1, 1);
|
||
}
|
||
|
||
return ret;
|
||
}
|
||
|
||
/*
|
||
****************************************************************************************************
|
||
*
|
||
* CSP_PIN_DEV_release
|
||
*
|
||
* Description:
|
||
* <20>ͷ<EFBFBD>ij<EFBFBD><EFBFBD><DFBC>豸<EFBFBD><E8B1B8>pin
|
||
*
|
||
* Parameters:
|
||
* p_handler : handler
|
||
* if_release_to_default_status : <20>Ƿ<EFBFBD><C7B7>ͷŵ<CDB7>ԭʼ״̬(<28>Ĵ<EFBFBD><C4B4><EFBFBD>ԭ<EFBFBD><D4AD>״̬)
|
||
*
|
||
* Return value:
|
||
* EGPIO_SUCCESS/EGPIO_FAIL
|
||
****************************************************************************************************
|
||
*/
|
||
#ifdef SUNXI_R_PIO_BASE
|
||
__s32 gpio_release(u32 p_handler, __s32 if_release_to_default_status)
|
||
{
|
||
char *tmp_buf; //ת<><D7AA><EFBFBD><EFBFBD>char<61><72><EFBFBD><EFBFBD>
|
||
__u32 group_count_max, first_port; //<2F><><EFBFBD><EFBFBD>GPIO<49><4F><EFBFBD><EFBFBD>
|
||
system_gpio_set_t *user_gpio_set, *tmp_sys_gpio_data;
|
||
__u32 tmp_group_func_data = 0;
|
||
__u32 tmp_group_pull_data = 0;
|
||
__u32 tmp_group_dlevel_data = 0;
|
||
volatile __u32 *tmp_group_func_addr = NULL, *tmp_group_pull_addr = NULL;
|
||
volatile __u32 *tmp_group_dlevel_addr = NULL;
|
||
__u32 port, port_num, port_num_pull, port_num_func;
|
||
__u32 pre_port = 0x7fffffff, pre_port_num_func = 0x7fffffff, pre_port_num_pull = 0x7fffffff;
|
||
__u32 i, tmp_val;
|
||
int cpus_flag = 0;
|
||
//<2F><><EFBFBD>鴫<EFBFBD><E9B4AB><EFBFBD>ľ<EFBFBD><C4BE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ч<EFBFBD><D0A7>
|
||
if(!p_handler)
|
||
{
|
||
return EGPIO_FAIL;
|
||
}
|
||
tmp_buf = (char *)p_handler;
|
||
group_count_max = *(int *)tmp_buf;
|
||
if(!group_count_max)
|
||
{
|
||
return EGPIO_FAIL;
|
||
}
|
||
if(if_release_to_default_status == 2)
|
||
{
|
||
//SYSCONFIG_DEBUG("gpio module : release p_handler = %x\n",p_handler);
|
||
free((char *)p_handler);
|
||
|
||
return EGPIO_SUCCESS;
|
||
}
|
||
user_gpio_set = (system_gpio_set_t *)(tmp_buf + 16);
|
||
//<2F><>ȡ<EFBFBD>û<EFBFBD><C3BB><EFBFBD><EFBFBD><EFBFBD>
|
||
for(first_port = 0; first_port < group_count_max; first_port++)
|
||
{
|
||
tmp_sys_gpio_data = user_gpio_set + first_port;
|
||
port = tmp_sys_gpio_data->port; //<2F><><EFBFBD><EFBFBD><EFBFBD>˿<EFBFBD><CBBF><EFBFBD>ֵ
|
||
port_num = tmp_sys_gpio_data->port_num; //<2F><><EFBFBD><EFBFBD><EFBFBD>˿<EFBFBD><CBBF>е<EFBFBD>ijһ<C4B3><D2BB>GPIO
|
||
if(!port)
|
||
{
|
||
continue;
|
||
}
|
||
if(port>=12)
|
||
cpus_flag = 1;
|
||
else
|
||
cpus_flag = 0;
|
||
port_num_func = (port_num >> 3);
|
||
port_num_pull = (port_num >> 4);
|
||
if(!cpus_flag)
|
||
{
|
||
tmp_group_func_addr = PIO_REG_CFG(port, port_num_func); //<2F><><EFBFBD>¹<EFBFBD><C2B9>ܼĴ<DCBC><C4B4><EFBFBD><EFBFBD><EFBFBD>ַ
|
||
tmp_group_pull_addr = PIO_REG_PULL(port, port_num_pull); //<2F><><EFBFBD><EFBFBD>pull<6C>Ĵ<EFBFBD><C4B4><EFBFBD>
|
||
tmp_group_dlevel_addr = PIO_REG_DLEVEL(port, port_num_pull);//<2F><><EFBFBD><EFBFBD>level<65>Ĵ<EFBFBD><C4B4><EFBFBD>
|
||
}
|
||
else
|
||
{
|
||
tmp_group_func_addr = R_PIO_REG_CFG(port, port_num_func); //<2F><><EFBFBD>¹<EFBFBD><C2B9>ܼĴ<DCBC><C4B4><EFBFBD><EFBFBD><EFBFBD>ַ
|
||
tmp_group_pull_addr = R_PIO_REG_PULL(port, port_num_pull); //<2F><><EFBFBD><EFBFBD>pull<6C>Ĵ<EFBFBD><C4B4><EFBFBD>
|
||
tmp_group_dlevel_addr = R_PIO_REG_DLEVEL(port, port_num_pull);//<2F><><EFBFBD><EFBFBD>level<65>Ĵ<EFBFBD><C4B4><EFBFBD>
|
||
}
|
||
tmp_group_func_data = GPIO_REG_READ(tmp_group_func_addr);
|
||
tmp_group_pull_data = GPIO_REG_READ(tmp_group_pull_addr);
|
||
tmp_group_dlevel_data = GPIO_REG_READ(tmp_group_dlevel_addr);
|
||
break;
|
||
}
|
||
if(first_port >= group_count_max)
|
||
{
|
||
return 0;
|
||
}
|
||
for(i = first_port; i < group_count_max; i++)
|
||
{
|
||
tmp_sys_gpio_data = user_gpio_set + i; //tmp_sys_gpio_dataָ<61><D6B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>GPIO<49>ռ<EFBFBD>
|
||
port = tmp_sys_gpio_data->port; //<2F><><EFBFBD><EFBFBD><EFBFBD>˿<EFBFBD><CBBF><EFBFBD>ֵ
|
||
port_num = tmp_sys_gpio_data->port_num; //<2F><><EFBFBD><EFBFBD><EFBFBD>˿<EFBFBD><CBBF>е<EFBFBD>ijһ<C4B3><D2BB>GPIO
|
||
if(port >= 12)
|
||
cpus_flag = 1;
|
||
else
|
||
cpus_flag = 0;
|
||
port_num_func = (port_num >> 3);
|
||
port_num_pull = (port_num >> 4);
|
||
|
||
if((port_num_pull != pre_port_num_pull) || (port != pre_port)) //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ<EFBFBD>ǰ<EFBFBD><C7B0><EFBFBD>ŵĶ˿ڲ<CBBF>һ<EFBFBD>£<EFBFBD><C2A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڵ<EFBFBD>pull<6C>Ĵ<EFBFBD><C4B4><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB>
|
||
{
|
||
GPIO_REG_WRITE(tmp_group_func_addr, tmp_group_func_data); //<2F><>д<EFBFBD><D0B4><EFBFBD>ܼĴ<DCBC><C4B4><EFBFBD>
|
||
GPIO_REG_WRITE(tmp_group_pull_addr, tmp_group_pull_data); //<2F><>дpull<6C>Ĵ<EFBFBD><C4B4><EFBFBD>
|
||
GPIO_REG_WRITE(tmp_group_dlevel_addr, tmp_group_dlevel_data); //<2F><>дdriver level<65>Ĵ<EFBFBD><C4B4><EFBFBD>
|
||
|
||
if(!cpus_flag)
|
||
{
|
||
tmp_group_func_addr = PIO_REG_CFG(port, port_num_func); //<2F><><EFBFBD>¹<EFBFBD><C2B9>ܼĴ<DCBC><C4B4><EFBFBD><EFBFBD><EFBFBD>ַ
|
||
tmp_group_pull_addr = PIO_REG_PULL(port, port_num_pull); //<2F><><EFBFBD><EFBFBD>pull<6C>Ĵ<EFBFBD><C4B4><EFBFBD>
|
||
tmp_group_dlevel_addr = PIO_REG_DLEVEL(port, port_num_pull); //<2F><><EFBFBD><EFBFBD>level<65>Ĵ<EFBFBD><C4B4><EFBFBD>
|
||
}
|
||
else
|
||
{
|
||
tmp_group_func_addr = R_PIO_REG_CFG(port, port_num_func); //<2F><><EFBFBD>¹<EFBFBD><C2B9>ܼĴ<DCBC><C4B4><EFBFBD><EFBFBD><EFBFBD>ַ
|
||
tmp_group_pull_addr = R_PIO_REG_PULL(port, port_num_pull); //<2F><><EFBFBD><EFBFBD>pull<6C>Ĵ<EFBFBD><C4B4><EFBFBD>
|
||
tmp_group_dlevel_addr = R_PIO_REG_DLEVEL(port, port_num_pull); //<2F><><EFBFBD><EFBFBD>level<65>Ĵ<EFBFBD><C4B4><EFBFBD>
|
||
}
|
||
|
||
tmp_group_func_data = GPIO_REG_READ(tmp_group_func_addr);
|
||
tmp_group_pull_data = GPIO_REG_READ(tmp_group_pull_addr);
|
||
tmp_group_dlevel_data = GPIO_REG_READ(tmp_group_dlevel_addr);
|
||
}
|
||
else if(pre_port_num_func != port_num_func) //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ<EFBFBD>ǰ<EFBFBD><C7B0><EFBFBD>ŵĹ<C5B5><C4B9>ܼĴ<DCBC><C4B4><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB>
|
||
{
|
||
GPIO_REG_WRITE(tmp_group_func_addr, tmp_group_func_data); //<2F><>ֻ<EFBFBD><D6BB>д<EFBFBD><D0B4><EFBFBD>ܼĴ<DCBC><C4B4><EFBFBD>
|
||
if(!cpus_flag)
|
||
tmp_group_func_addr = PIO_REG_CFG(port, port_num_func); //<2F><><EFBFBD>¹<EFBFBD><C2B9>ܼĴ<DCBC><C4B4><EFBFBD><EFBFBD><EFBFBD>ַ
|
||
else
|
||
tmp_group_func_addr = R_PIO_REG_CFG(port , port_num_func);
|
||
tmp_group_func_data = GPIO_REG_READ(tmp_group_func_addr);
|
||
}
|
||
|
||
pre_port_num_pull = port_num_pull;
|
||
pre_port_num_func = port_num_func;
|
||
pre_port = port;
|
||
//<2F><><EFBFBD>¹<EFBFBD><C2B9>ܼĴ<DCBC><C4B4><EFBFBD>
|
||
tmp_group_func_data &= ~(0x07 << ((port_num - (port_num_func<<3)) << 2));
|
||
//<2F><><EFBFBD><EFBFBD>pull״̬<D7B4>Ĵ<EFBFBD><C4B4><EFBFBD>
|
||
tmp_val = (port_num - (port_num_pull<<4)) << 1;
|
||
tmp_group_pull_data &= ~(0x03 << tmp_val);
|
||
tmp_group_pull_data |= (tmp_sys_gpio_data->hardware_gpio_status.pull & 0x03) << tmp_val;
|
||
//<2F><><EFBFBD><EFBFBD>driver״̬<D7B4>Ĵ<EFBFBD><C4B4><EFBFBD>
|
||
tmp_val = (port_num - (port_num_pull<<4)) << 1;
|
||
tmp_group_dlevel_data &= ~(0x03 << tmp_val);
|
||
tmp_group_dlevel_data |= (tmp_sys_gpio_data->hardware_gpio_status.drv_level & 0x03) << tmp_val;
|
||
}
|
||
if(tmp_group_func_addr) //ֻҪ<D6BB><D2AA><EFBFBD>¹<EFBFBD><C2B9>Ĵ<EFBFBD><C4B4><EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD>Ϳ<EFBFBD><CDBF>Զ<EFBFBD>Ӳ<EFBFBD><D3B2><EFBFBD><EFBFBD>ֵ
|
||
{ //<2F><>ô<EFBFBD><C3B4><EFBFBD><EFBFBD><EFBFBD>е<EFBFBD>ֵȫ<D6B5><C8AB><EFBFBD><EFBFBD>д<EFBFBD><D0B4>Ӳ<EFBFBD><D3B2><EFBFBD>Ĵ<EFBFBD><C4B4><EFBFBD>
|
||
GPIO_REG_WRITE(tmp_group_func_addr, tmp_group_func_data); //<2F><>д<EFBFBD><D0B4><EFBFBD>ܼĴ<DCBC><C4B4><EFBFBD>
|
||
}
|
||
if(tmp_group_pull_addr)
|
||
{
|
||
GPIO_REG_WRITE(tmp_group_pull_addr, tmp_group_pull_data);
|
||
}
|
||
if(tmp_group_dlevel_addr)
|
||
{
|
||
GPIO_REG_WRITE(tmp_group_dlevel_addr, tmp_group_dlevel_data);
|
||
}
|
||
|
||
free((char *)p_handler);
|
||
|
||
return EGPIO_SUCCESS;
|
||
}
|
||
#else
|
||
__s32 gpio_release(u32 p_handler, __s32 if_release_to_default_status)
|
||
{
|
||
char *tmp_buf; //ת<><D7AA><EFBFBD><EFBFBD>char<61><72><EFBFBD><EFBFBD>
|
||
__u32 group_count_max, first_port; //<2F><><EFBFBD><EFBFBD>GPIO<49><4F><EFBFBD><EFBFBD>
|
||
system_gpio_set_t *user_gpio_set, *tmp_sys_gpio_data;
|
||
__u32 tmp_group_func_data = 0;
|
||
__u32 tmp_group_pull_data = 0;
|
||
__u32 tmp_group_dlevel_data = 0;
|
||
volatile __u32 *tmp_group_func_addr = NULL, *tmp_group_pull_addr = NULL;
|
||
volatile __u32 *tmp_group_dlevel_addr = NULL;
|
||
__u32 port, port_num, port_num_pull, port_num_func;
|
||
__u32 pre_port = 0x7fffffff, pre_port_num_func = 0x7fffffff, pre_port_num_pull = 0x7fffffff;
|
||
__u32 i, tmp_val;
|
||
//<2F><><EFBFBD>鴫<EFBFBD><E9B4AB><EFBFBD>ľ<EFBFBD><C4BE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ч<EFBFBD><D0A7>
|
||
if(!p_handler)
|
||
{
|
||
return EGPIO_FAIL;
|
||
}
|
||
tmp_buf = (char *)p_handler;
|
||
group_count_max = *(int *)tmp_buf;
|
||
if(!group_count_max)
|
||
{
|
||
return EGPIO_FAIL;
|
||
}
|
||
if(if_release_to_default_status == 2)
|
||
{
|
||
//SYSCONFIG_DEBUG("gpio module : release p_handler = %x\n",p_handler);
|
||
free((char *)p_handler);
|
||
|
||
return EGPIO_SUCCESS;
|
||
}
|
||
user_gpio_set = (system_gpio_set_t *)(tmp_buf + 16);
|
||
//<2F><>ȡ<EFBFBD>û<EFBFBD><C3BB><EFBFBD><EFBFBD><EFBFBD>
|
||
for(first_port = 0; first_port < group_count_max; first_port++)
|
||
{
|
||
tmp_sys_gpio_data = user_gpio_set + first_port;
|
||
port = tmp_sys_gpio_data->port; //<2F><><EFBFBD><EFBFBD><EFBFBD>˿<EFBFBD><CBBF><EFBFBD>ֵ
|
||
port_num = tmp_sys_gpio_data->port_num; //<2F><><EFBFBD><EFBFBD><EFBFBD>˿<EFBFBD><CBBF>е<EFBFBD>ijһ<C4B3><D2BB>GPIO
|
||
if(!port)
|
||
{
|
||
continue;
|
||
}
|
||
port_num_func = (port_num >> 3);
|
||
port_num_pull = (port_num >> 4);
|
||
|
||
tmp_group_func_addr = PIO_REG_CFG(port, port_num_func); //<2F><><EFBFBD>¹<EFBFBD><C2B9>ܼĴ<DCBC><C4B4><EFBFBD><EFBFBD><EFBFBD>ַ
|
||
tmp_group_pull_addr = PIO_REG_PULL(port, port_num_pull); //<2F><><EFBFBD><EFBFBD>pull<6C>Ĵ<EFBFBD><C4B4><EFBFBD>
|
||
tmp_group_dlevel_addr = PIO_REG_DLEVEL(port, port_num_pull);//<2F><><EFBFBD><EFBFBD>level<65>Ĵ<EFBFBD><C4B4><EFBFBD>
|
||
|
||
tmp_group_func_data = GPIO_REG_READ(tmp_group_func_addr);
|
||
tmp_group_pull_data = GPIO_REG_READ(tmp_group_pull_addr);
|
||
tmp_group_dlevel_data = GPIO_REG_READ(tmp_group_dlevel_addr);
|
||
break;
|
||
}
|
||
if(first_port >= group_count_max)
|
||
{
|
||
return 0;
|
||
}
|
||
for(i = first_port; i < group_count_max; i++)
|
||
{
|
||
tmp_sys_gpio_data = user_gpio_set + i; //tmp_sys_gpio_dataָ<61><D6B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>GPIO<49>ռ<EFBFBD>
|
||
port = tmp_sys_gpio_data->port; //<2F><><EFBFBD><EFBFBD><EFBFBD>˿<EFBFBD><CBBF><EFBFBD>ֵ
|
||
port_num = tmp_sys_gpio_data->port_num; //<2F><><EFBFBD><EFBFBD><EFBFBD>˿<EFBFBD><CBBF>е<EFBFBD>ijһ<C4B3><D2BB>GPIO
|
||
|
||
port_num_func = (port_num >> 3);
|
||
port_num_pull = (port_num >> 4);
|
||
|
||
if((port_num_pull != pre_port_num_pull) || (port != pre_port)) //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ<EFBFBD>ǰ<EFBFBD><C7B0><EFBFBD>ŵĶ˿ڲ<CBBF>һ<EFBFBD>£<EFBFBD><C2A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڵ<EFBFBD>pull<6C>Ĵ<EFBFBD><C4B4><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB>
|
||
{
|
||
GPIO_REG_WRITE(tmp_group_func_addr, tmp_group_func_data); //<2F><>д<EFBFBD><D0B4><EFBFBD>ܼĴ<DCBC><C4B4><EFBFBD>
|
||
GPIO_REG_WRITE(tmp_group_pull_addr, tmp_group_pull_data); //<2F><>дpull<6C>Ĵ<EFBFBD><C4B4><EFBFBD>
|
||
GPIO_REG_WRITE(tmp_group_dlevel_addr, tmp_group_dlevel_data); //<2F><>дdriver level<65>Ĵ<EFBFBD><C4B4><EFBFBD>
|
||
|
||
tmp_group_func_addr = PIO_REG_CFG(port, port_num_func); //<2F><><EFBFBD>¹<EFBFBD><C2B9>ܼĴ<DCBC><C4B4><EFBFBD><EFBFBD><EFBFBD>ַ
|
||
tmp_group_pull_addr = PIO_REG_PULL(port, port_num_pull); //<2F><><EFBFBD><EFBFBD>pull<6C>Ĵ<EFBFBD><C4B4><EFBFBD>
|
||
tmp_group_dlevel_addr = PIO_REG_DLEVEL(port, port_num_pull); //<2F><><EFBFBD><EFBFBD>level<65>Ĵ<EFBFBD><C4B4><EFBFBD>
|
||
|
||
tmp_group_func_data = GPIO_REG_READ(tmp_group_func_addr);
|
||
tmp_group_pull_data = GPIO_REG_READ(tmp_group_pull_addr);
|
||
tmp_group_dlevel_data = GPIO_REG_READ(tmp_group_dlevel_addr);
|
||
}
|
||
else if(pre_port_num_func != port_num_func) //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ<EFBFBD>ǰ<EFBFBD><C7B0><EFBFBD>ŵĹ<C5B5><C4B9>ܼĴ<DCBC><C4B4><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB>
|
||
{
|
||
GPIO_REG_WRITE(tmp_group_func_addr, tmp_group_func_data); //<2F><>ֻ<EFBFBD><D6BB>д<EFBFBD><D0B4><EFBFBD>ܼĴ<DCBC><C4B4><EFBFBD>
|
||
tmp_group_func_addr = PIO_REG_CFG(port, port_num_func); //<2F><><EFBFBD>¹<EFBFBD><C2B9>ܼĴ<DCBC><C4B4><EFBFBD><EFBFBD><EFBFBD>ַ
|
||
tmp_group_func_data = GPIO_REG_READ(tmp_group_func_addr);
|
||
}
|
||
|
||
pre_port_num_pull = port_num_pull;
|
||
pre_port_num_func = port_num_func;
|
||
pre_port = port;
|
||
//<2F><><EFBFBD>¹<EFBFBD><C2B9>ܼĴ<DCBC><C4B4><EFBFBD>
|
||
tmp_group_func_data &= ~(0x07 << ((port_num - (port_num_func<<3)) << 2));
|
||
//<2F><><EFBFBD><EFBFBD>pull״̬<D7B4>Ĵ<EFBFBD><C4B4><EFBFBD>
|
||
tmp_val = (port_num - (port_num_pull<<4)) << 1;
|
||
tmp_group_pull_data &= ~(0x03 << tmp_val);
|
||
tmp_group_pull_data |= (tmp_sys_gpio_data->hardware_gpio_status.pull & 0x03) << tmp_val;
|
||
//<2F><><EFBFBD><EFBFBD>driver״̬<D7B4>Ĵ<EFBFBD><C4B4><EFBFBD>
|
||
tmp_val = (port_num - (port_num_pull<<4)) << 1;
|
||
tmp_group_dlevel_data &= ~(0x03 << tmp_val);
|
||
tmp_group_dlevel_data |= (tmp_sys_gpio_data->hardware_gpio_status.drv_level & 0x03) << tmp_val;
|
||
}
|
||
if(tmp_group_func_addr) //ֻҪ<D6BB><D2AA><EFBFBD>¹<EFBFBD><C2B9>Ĵ<EFBFBD><C4B4><EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD>Ϳ<EFBFBD><CDBF>Զ<EFBFBD>Ӳ<EFBFBD><D3B2><EFBFBD><EFBFBD>ֵ
|
||
{ //<2F><>ô<EFBFBD><C3B4><EFBFBD><EFBFBD><EFBFBD>е<EFBFBD>ֵȫ<D6B5><C8AB><EFBFBD><EFBFBD>д<EFBFBD><D0B4>Ӳ<EFBFBD><D3B2><EFBFBD>Ĵ<EFBFBD><C4B4><EFBFBD>
|
||
GPIO_REG_WRITE(tmp_group_func_addr, tmp_group_func_data); //<2F><>д<EFBFBD><D0B4><EFBFBD>ܼĴ<DCBC><C4B4><EFBFBD>
|
||
}
|
||
if(tmp_group_pull_addr)
|
||
{
|
||
GPIO_REG_WRITE(tmp_group_pull_addr, tmp_group_pull_data);
|
||
}
|
||
if(tmp_group_dlevel_addr)
|
||
{
|
||
GPIO_REG_WRITE(tmp_group_dlevel_addr, tmp_group_dlevel_data);
|
||
}
|
||
|
||
free((char *)p_handler);
|
||
|
||
return EGPIO_SUCCESS;
|
||
}
|
||
#endif
|
||
/*
|
||
**********************************************************************************************************************
|
||
* CSP_PIN_Get_All_Gpio_Status
|
||
*
|
||
* Description:
|
||
* <20><>ȡ<EFBFBD>û<EFBFBD><C3BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>GPIO<49><4F>״̬
|
||
* Arguments :
|
||
* p_handler : handler
|
||
* gpio_status : <20><><EFBFBD><EFBFBD><EFBFBD>û<EFBFBD><C3BB><EFBFBD><EFBFBD>ݵ<EFBFBD><DDB5><EFBFBD><EFBFBD><EFBFBD>
|
||
* gpio_count_max : <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Խ<EFBFBD><D4BD>
|
||
* if_get_user_set_flag : <20><>ȡ<EFBFBD><C8A1>־<EFBFBD><D6BE><EFBFBD><EFBFBD>ʾ<EFBFBD><CABE>ȡ<EFBFBD>û<EFBFBD><C3BB>趨<EFBFBD><E8B6A8><EFBFBD>ݻ<EFBFBD><DDBB><EFBFBD><EFBFBD><EFBFBD>ʵ<EFBFBD><CAB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||
* Returns :
|
||
*
|
||
* Notes :
|
||
*
|
||
**********************************************************************************************************************
|
||
*/
|
||
#ifdef SUNXI_R_PIO_BASE
|
||
__s32 gpio_get_all_pin_status(u32 p_handler, user_gpio_set_t *gpio_status, __u32 gpio_count_max, __u32 if_get_from_hardware)
|
||
{
|
||
char *tmp_buf; //ת<><D7AA><EFBFBD><EFBFBD>char<61><72><EFBFBD><EFBFBD>
|
||
__u32 group_count_max, first_port; //<2F><><EFBFBD><EFBFBD>GPIO<49><4F><EFBFBD><EFBFBD>
|
||
system_gpio_set_t *user_gpio_set, *tmp_sys_gpio_data;
|
||
user_gpio_set_t *script_gpio;
|
||
__u32 port_num_func, port_num_pull;
|
||
volatile __u32 *tmp_group_func_addr = NULL, *tmp_group_pull_addr;
|
||
volatile __u32 *tmp_group_data_addr, *tmp_group_dlevel_addr;
|
||
__u32 port, port_num;
|
||
__u32 pre_port = 0x7fffffff, pre_port_num_func = 0x7fffffff, pre_port_num_pull = 0x7fffffff;
|
||
__u32 i;
|
||
int cpus_flag = 0;
|
||
if((!p_handler) || (!gpio_status))
|
||
{
|
||
return EGPIO_FAIL;
|
||
}
|
||
if(gpio_count_max <= 0)
|
||
{
|
||
return EGPIO_FAIL;
|
||
}
|
||
tmp_buf = (char *)p_handler;
|
||
group_count_max = *(int *)tmp_buf;
|
||
if(group_count_max <= 0)
|
||
{
|
||
return EGPIO_FAIL;
|
||
}
|
||
user_gpio_set = (system_gpio_set_t *)(tmp_buf + 16);
|
||
if(group_count_max > gpio_count_max)
|
||
{
|
||
group_count_max = gpio_count_max;
|
||
}
|
||
//<2F><>ȡ<EFBFBD>û<EFBFBD><C3BB><EFBFBD><EFBFBD><EFBFBD>
|
||
//<2F><>ʾ<EFBFBD><CABE>ȡ<EFBFBD>û<EFBFBD><C3BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||
if(!if_get_from_hardware)
|
||
{
|
||
for(i = 0; i < group_count_max; i++)
|
||
{
|
||
tmp_sys_gpio_data = user_gpio_set + i; //tmp_sys_gpio_data?<3F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>GPIO<49>ռ<EFBFBD>
|
||
script_gpio = gpio_status + i; //script_gpioָ<6F><D6B8><EFBFBD>û<EFBFBD><C3BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ŀռ<C4BF>
|
||
|
||
script_gpio->port = tmp_sys_gpio_data->port; //<2F><><EFBFBD><EFBFBD>port<72><74><EFBFBD><EFBFBD>
|
||
script_gpio->port_num = tmp_sys_gpio_data->port_num; //<2F><><EFBFBD><EFBFBD>port_num<75><6D><EFBFBD><EFBFBD>
|
||
script_gpio->pull = tmp_sys_gpio_data->user_gpio_status.pull; //<2F><><EFBFBD><EFBFBD>pull<6C><6C><EFBFBD><EFBFBD>
|
||
script_gpio->mul_sel = tmp_sys_gpio_data->user_gpio_status.mul_sel; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||
script_gpio->drv_level = tmp_sys_gpio_data->user_gpio_status.drv_level; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||
script_gpio->data = tmp_sys_gpio_data->user_gpio_status.data; //<2F><><EFBFBD><EFBFBD>data<74><61><EFBFBD><EFBFBD>
|
||
strcpy(script_gpio->gpio_name, tmp_sys_gpio_data->gpio_name);
|
||
}
|
||
}
|
||
else
|
||
{
|
||
for(first_port = 0; first_port < group_count_max; first_port++)
|
||
{
|
||
tmp_sys_gpio_data = user_gpio_set + first_port;
|
||
port = tmp_sys_gpio_data->port; //<2F><><EFBFBD><EFBFBD><EFBFBD>˿<EFBFBD><CBBF><EFBFBD>ֵ
|
||
port_num = tmp_sys_gpio_data->port_num; //<2F><><EFBFBD><EFBFBD><EFBFBD>˿<EFBFBD><CBBF>е<EFBFBD>ijһ<C4B3><D2BB>GPIO
|
||
|
||
if(!port)
|
||
{
|
||
continue;
|
||
}
|
||
if(port >= 12)
|
||
cpus_flag = 1;
|
||
else
|
||
cpus_flag = 0;
|
||
port_num_func = (port_num >> 3);
|
||
port_num_pull = (port_num >> 4);
|
||
if(!cpus_flag)
|
||
{
|
||
tmp_group_func_addr = PIO_REG_CFG(port, port_num_func); //<2F><><EFBFBD>¹<EFBFBD><C2B9>ܼĴ<DCBC><C4B4><EFBFBD><EFBFBD><EFBFBD>ַ
|
||
tmp_group_pull_addr = PIO_REG_PULL(port, port_num_pull); //<2F><><EFBFBD><EFBFBD>pull<6C>Ĵ<EFBFBD><C4B4><EFBFBD>
|
||
tmp_group_dlevel_addr = PIO_REG_DLEVEL(port, port_num_pull); //<2F><><EFBFBD><EFBFBD>level<65>Ĵ<EFBFBD><C4B4><EFBFBD>
|
||
tmp_group_data_addr = PIO_REG_DATA(port); //<2F><><EFBFBD><EFBFBD>data<74>Ĵ<EFBFBD><C4B4><EFBFBD>
|
||
}
|
||
else
|
||
{
|
||
tmp_group_func_addr = R_PIO_REG_CFG(port, port_num_func); //<2F><><EFBFBD>¹<EFBFBD><C2B9>ܼĴ<DCBC><C4B4><EFBFBD><EFBFBD><EFBFBD>ַ
|
||
tmp_group_pull_addr = R_PIO_REG_PULL(port, port_num_pull); //<2F><><EFBFBD><EFBFBD>pull<6C>Ĵ<EFBFBD><C4B4><EFBFBD>
|
||
tmp_group_dlevel_addr = R_PIO_REG_DLEVEL(port, port_num_pull); //<2F><><EFBFBD><EFBFBD>level<65>Ĵ<EFBFBD><C4B4><EFBFBD>
|
||
tmp_group_data_addr = R_PIO_REG_DATA(port); //<2F><><EFBFBD><EFBFBD>data<74>Ĵ<EFBFBD><C4B4><EFBFBD>
|
||
}
|
||
break;
|
||
}
|
||
if(first_port >= group_count_max)
|
||
{
|
||
return 0;
|
||
}
|
||
for(i = first_port; i < group_count_max; i++)
|
||
{
|
||
tmp_sys_gpio_data = user_gpio_set + i; //tmp_sys_gpio_dataָ<61><D6B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>GPIO<49>ռ<EFBFBD>
|
||
script_gpio = gpio_status + i; //script_gpioָ<6F><D6B8><EFBFBD>û<EFBFBD><C3BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ŀռ<C4BF>
|
||
|
||
port = tmp_sys_gpio_data->port; //<2F><><EFBFBD><EFBFBD><EFBFBD>˿<EFBFBD><CBBF><EFBFBD>ֵ
|
||
port_num = tmp_sys_gpio_data->port_num; //<2F><><EFBFBD><EFBFBD><EFBFBD>˿<EFBFBD><CBBF>е<EFBFBD>ijһ<C4B3><D2BB>GPIO
|
||
|
||
script_gpio->port = port; //<2F><><EFBFBD><EFBFBD>port<72><74><EFBFBD><EFBFBD>
|
||
script_gpio->port_num = port_num; //<2F><><EFBFBD><EFBFBD>port_num<75><6D><EFBFBD><EFBFBD>
|
||
strcpy(script_gpio->gpio_name, tmp_sys_gpio_data->gpio_name);
|
||
|
||
port_num_func = (port_num >> 3);
|
||
port_num_pull = (port_num >> 4);
|
||
|
||
if((port_num_pull != pre_port_num_pull) || (port != pre_port)) //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ<EFBFBD>ǰ<EFBFBD><C7B0><EFBFBD>ŵĶ˿ڲ<CBBF>һ<EFBFBD>£<EFBFBD><C2A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڵ<EFBFBD>pull<6C>Ĵ<EFBFBD><C4B4><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB>
|
||
{
|
||
if(!cpus_flag)
|
||
{
|
||
tmp_group_func_addr = PIO_REG_CFG(port, port_num_func); //<2F><><EFBFBD>¹<EFBFBD><C2B9>ܼĴ<DCBC><C4B4><EFBFBD><EFBFBD><EFBFBD>ַ
|
||
tmp_group_pull_addr = PIO_REG_PULL(port, port_num_pull); //<2F><><EFBFBD><EFBFBD>pull<6C>Ĵ<EFBFBD><C4B4><EFBFBD>
|
||
tmp_group_dlevel_addr = PIO_REG_DLEVEL(port, port_num_pull); //<2F><><EFBFBD><EFBFBD>level<65>Ĵ<EFBFBD><C4B4><EFBFBD>
|
||
tmp_group_data_addr = PIO_REG_DATA(port); //<2F><><EFBFBD><EFBFBD>data<74>Ĵ<EFBFBD><C4B4><EFBFBD>
|
||
}
|
||
else
|
||
{
|
||
tmp_group_func_addr = R_PIO_REG_CFG(port, port_num_func); //<2F><><EFBFBD>¹<EFBFBD><C2B9>ܼĴ<DCBC><C4B4><EFBFBD><EFBFBD><EFBFBD>ַ
|
||
tmp_group_pull_addr = R_PIO_REG_PULL(port, port_num_pull); //<2F><><EFBFBD><EFBFBD>pull<6C>Ĵ<EFBFBD><C4B4><EFBFBD>
|
||
tmp_group_dlevel_addr = R_PIO_REG_DLEVEL(port, port_num_pull); //<2F><><EFBFBD><EFBFBD>level<65>Ĵ<EFBFBD><C4B4><EFBFBD>
|
||
tmp_group_data_addr = R_PIO_REG_DATA(port); //<2F><><EFBFBD><EFBFBD>data<74>Ĵ<EFBFBD><C4B4><EFBFBD>
|
||
}
|
||
}
|
||
else if(pre_port_num_func != port_num_func) //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ<EFBFBD>ǰ<EFBFBD><C7B0><EFBFBD>ŵĹ<C5B5><C4B9>ܼĴ<DCBC><C4B4><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB>
|
||
{
|
||
if(!cpus_flag)
|
||
tmp_group_func_addr = PIO_REG_CFG(port, port_num_func); //<2F><><EFBFBD>¹<EFBFBD><C2B9>ܼĴ<DCBC><C4B4><EFBFBD><EFBFBD><EFBFBD>ַ
|
||
else
|
||
tmp_group_func_addr = R_PIO_REG_CFG(port,port_num_func);
|
||
}
|
||
|
||
pre_port_num_pull = port_num_pull;
|
||
pre_port_num_func = port_num_func;
|
||
pre_port = port;
|
||
//<2F><><EFBFBD>û<EFBFBD><C3BB>ؼ<EFBFBD><D8BC><EFBFBD>ֵ
|
||
script_gpio->pull = (GPIO_REG_READ(tmp_group_pull_addr) >> ((port_num - (port_num_pull<<4))<<1)) & 0x03; //<2F><><EFBFBD><EFBFBD>pull<6C><6C><EFBFBD><EFBFBD>
|
||
script_gpio->drv_level = (GPIO_REG_READ(tmp_group_dlevel_addr) >> ((port_num - (port_num_pull<<4))<<1)) & 0x03; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||
script_gpio->mul_sel = (GPIO_REG_READ(tmp_group_func_addr) >> ((port_num - (port_num_func<<3))<<2)) & 0x07; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||
if(script_gpio->mul_sel <= 1)
|
||
{
|
||
script_gpio->data = (GPIO_REG_READ(tmp_group_data_addr) >> port_num) & 0x01; //<2F><><EFBFBD><EFBFBD>data<74><61><EFBFBD><EFBFBD>
|
||
}
|
||
else
|
||
{
|
||
script_gpio->data = -1;
|
||
}
|
||
}
|
||
}
|
||
|
||
return EGPIO_SUCCESS;
|
||
}
|
||
#else
|
||
__s32 gpio_get_all_pin_status(u32 p_handler, user_gpio_set_t *gpio_status, __u32 gpio_count_max, __u32 if_get_from_hardware)
|
||
{
|
||
char *tmp_buf; //ת<><D7AA><EFBFBD><EFBFBD>char<61><72><EFBFBD><EFBFBD>
|
||
__u32 group_count_max, first_port; //<2F><><EFBFBD><EFBFBD>GPIO<49><4F><EFBFBD><EFBFBD>
|
||
system_gpio_set_t *user_gpio_set, *tmp_sys_gpio_data;
|
||
user_gpio_set_t *script_gpio;
|
||
__u32 port_num_func, port_num_pull;
|
||
volatile __u32 *tmp_group_func_addr = NULL, *tmp_group_pull_addr;
|
||
volatile __u32 *tmp_group_data_addr, *tmp_group_dlevel_addr;
|
||
__u32 port, port_num;
|
||
__u32 pre_port = 0x7fffffff, pre_port_num_func = 0x7fffffff, pre_port_num_pull = 0x7fffffff;
|
||
__u32 i;
|
||
|
||
if((!p_handler) || (!gpio_status))
|
||
{
|
||
return EGPIO_FAIL;
|
||
}
|
||
if(gpio_count_max <= 0)
|
||
{
|
||
return EGPIO_FAIL;
|
||
}
|
||
tmp_buf = (char *)p_handler;
|
||
group_count_max = *(int *)tmp_buf;
|
||
if(group_count_max <= 0)
|
||
{
|
||
return EGPIO_FAIL;
|
||
}
|
||
user_gpio_set = (system_gpio_set_t *)(tmp_buf + 16);
|
||
if(group_count_max > gpio_count_max)
|
||
{
|
||
group_count_max = gpio_count_max;
|
||
}
|
||
//<2F><>ȡ<EFBFBD>û<EFBFBD><C3BB><EFBFBD><EFBFBD><EFBFBD>
|
||
//<2F><>ʾ<EFBFBD><CABE>ȡ<EFBFBD>û<EFBFBD><C3BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||
if(!if_get_from_hardware)
|
||
{
|
||
for(i = 0; i < group_count_max; i++)
|
||
{
|
||
tmp_sys_gpio_data = user_gpio_set + i; //tmp_sys_gpio_dataָ<61><D6B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>GPIO<49>ռ<EFBFBD>
|
||
script_gpio = gpio_status + i; //script_gpioָ<6F><D6B8><EFBFBD>û<EFBFBD><C3BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ŀռ<C4BF>
|
||
|
||
script_gpio->port = tmp_sys_gpio_data->port; //<2F><><EFBFBD><EFBFBD>port<72><74><EFBFBD><EFBFBD>
|
||
script_gpio->port_num = tmp_sys_gpio_data->port_num; //<2F><><EFBFBD><EFBFBD>port_num<75><6D><EFBFBD><EFBFBD>
|
||
script_gpio->pull = tmp_sys_gpio_data->user_gpio_status.pull; //<2F><><EFBFBD><EFBFBD>pull<6C><6C><EFBFBD><EFBFBD>
|
||
script_gpio->mul_sel = tmp_sys_gpio_data->user_gpio_status.mul_sel; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||
script_gpio->drv_level = tmp_sys_gpio_data->user_gpio_status.drv_level; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||
script_gpio->data = tmp_sys_gpio_data->user_gpio_status.data; //<2F><><EFBFBD><EFBFBD>data<74><61><EFBFBD><EFBFBD>
|
||
strcpy(script_gpio->gpio_name, tmp_sys_gpio_data->gpio_name);
|
||
}
|
||
}
|
||
else
|
||
{
|
||
for(first_port = 0; first_port < group_count_max; first_port++)
|
||
{
|
||
tmp_sys_gpio_data = user_gpio_set + first_port;
|
||
port = tmp_sys_gpio_data->port; //<2F><><EFBFBD><EFBFBD><EFBFBD>˿<EFBFBD><CBBF><EFBFBD>ֵ
|
||
port_num = tmp_sys_gpio_data->port_num; //<2F><><EFBFBD><EFBFBD><EFBFBD>˿<EFBFBD><CBBF>е<EFBFBD>ijһ<C4B3><D2BB>GPIO
|
||
|
||
if(!port)
|
||
{
|
||
continue;
|
||
}
|
||
port_num_func = (port_num >> 3);
|
||
port_num_pull = (port_num >> 4);
|
||
tmp_group_func_addr = PIO_REG_CFG(port, port_num_func); //<2F><><EFBFBD>¹<EFBFBD><C2B9>ܼĴ<DCBC><C4B4><EFBFBD><EFBFBD><EFBFBD>ַ
|
||
tmp_group_pull_addr = PIO_REG_PULL(port, port_num_pull); //<2F><><EFBFBD><EFBFBD>pull<6C>Ĵ<EFBFBD><C4B4><EFBFBD>
|
||
tmp_group_dlevel_addr = PIO_REG_DLEVEL(port, port_num_pull); //<2F><><EFBFBD><EFBFBD>level<65>Ĵ<EFBFBD><C4B4><EFBFBD>
|
||
tmp_group_data_addr = PIO_REG_DATA(port); //<2F><><EFBFBD><EFBFBD>data<74>Ĵ<EFBFBD><C4B4><EFBFBD>
|
||
break;
|
||
}
|
||
if(first_port >= group_count_max)
|
||
{
|
||
return 0;
|
||
}
|
||
for(i = first_port; i < group_count_max; i++)
|
||
{
|
||
tmp_sys_gpio_data = user_gpio_set + i; //tmp_sys_gpio_dataָ<61><D6B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>GPIO<49>ռ<EFBFBD>
|
||
script_gpio = gpio_status + i; //script_gpioָ<6F><D6B8><EFBFBD>û<EFBFBD><C3BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ŀռ<C4BF>
|
||
|
||
port = tmp_sys_gpio_data->port; //<2F><><EFBFBD><EFBFBD><EFBFBD>˿<EFBFBD><CBBF><EFBFBD>ֵ
|
||
port_num = tmp_sys_gpio_data->port_num; //<2F><><EFBFBD><EFBFBD><EFBFBD>˿<EFBFBD><CBBF>е<EFBFBD>ijһ<C4B3><D2BB>GPIO
|
||
|
||
script_gpio->port = port; //<2F><><EFBFBD><EFBFBD>port<72><74><EFBFBD><EFBFBD>
|
||
script_gpio->port_num = port_num; //<2F><><EFBFBD><EFBFBD>port_num<75><6D><EFBFBD><EFBFBD>
|
||
strcpy(script_gpio->gpio_name, tmp_sys_gpio_data->gpio_name);
|
||
|
||
port_num_func = (port_num >> 3);
|
||
port_num_pull = (port_num >> 4);
|
||
|
||
if((port_num_pull != pre_port_num_pull) || (port != pre_port)) //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ<EFBFBD>ǰ<EFBFBD><C7B0><EFBFBD>ŵĶ˿ڲ<CBBF>һ<EFBFBD>£<EFBFBD><C2A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڵ<EFBFBD>pull<6C>Ĵ<EFBFBD><C4B4><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB>
|
||
{
|
||
tmp_group_func_addr = PIO_REG_CFG(port, port_num_func); //<2F><><EFBFBD>¹<EFBFBD><C2B9>ܼĴ<DCBC><C4B4><EFBFBD><EFBFBD><EFBFBD>ַ
|
||
tmp_group_pull_addr = PIO_REG_PULL(port, port_num_pull); //<2F><><EFBFBD><EFBFBD>pull<6C>Ĵ<EFBFBD><C4B4><EFBFBD>
|
||
tmp_group_dlevel_addr = PIO_REG_DLEVEL(port, port_num_pull); //<2F><><EFBFBD><EFBFBD>level<65>Ĵ<EFBFBD><C4B4><EFBFBD>
|
||
tmp_group_data_addr = PIO_REG_DATA(port); //<2F><><EFBFBD><EFBFBD>data<74>Ĵ<EFBFBD><C4B4><EFBFBD>
|
||
}
|
||
else if(pre_port_num_func != port_num_func) //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ<EFBFBD>ǰ<EFBFBD><C7B0><EFBFBD>ŵĹ<C5B5><C4B9>ܼĴ<DCBC><C4B4><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB>
|
||
{
|
||
tmp_group_func_addr = PIO_REG_CFG(port, port_num_func); //<2F><><EFBFBD>¹<EFBFBD><C2B9>ܼĴ<DCBC><C4B4><EFBFBD><EFBFBD><EFBFBD>ַ
|
||
}
|
||
|
||
pre_port_num_pull = port_num_pull;
|
||
pre_port_num_func = port_num_func;
|
||
pre_port = port;
|
||
//<2F><><EFBFBD>û<EFBFBD><C3BB>ؼ<EFBFBD><D8BC><EFBFBD>ֵ
|
||
script_gpio->pull = (GPIO_REG_READ(tmp_group_pull_addr) >> ((port_num - (port_num_pull<<4))<<1)) & 0x03; //<2F><><EFBFBD><EFBFBD>pull<6C><6C><EFBFBD><EFBFBD>
|
||
script_gpio->drv_level = (GPIO_REG_READ(tmp_group_dlevel_addr) >> ((port_num - (port_num_pull<<4))<<1)) & 0x03; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||
script_gpio->mul_sel = (GPIO_REG_READ(tmp_group_func_addr) >> ((port_num - (port_num_func<<3))<<2)) & 0x07; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||
if(script_gpio->mul_sel <= 1)
|
||
{
|
||
script_gpio->data = (GPIO_REG_READ(tmp_group_data_addr) >> port_num) & 0x01; //<2F><><EFBFBD><EFBFBD>data<74><61><EFBFBD><EFBFBD>
|
||
}
|
||
else
|
||
{
|
||
script_gpio->data = -1;
|
||
}
|
||
}
|
||
}
|
||
|
||
return EGPIO_SUCCESS;
|
||
}
|
||
|
||
#endif
|
||
/*
|
||
**********************************************************************************************************************
|
||
* CSP_GPIO_Get_One_PIN_Status
|
||
*
|
||
* Description:
|
||
* <20><>ȡ<EFBFBD>û<EFBFBD><C3BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>GPIO<49><4F>״̬
|
||
* Arguments :
|
||
* p_handler : handler
|
||
* gpio_status : <20><><EFBFBD><EFBFBD><EFBFBD>û<EFBFBD><C3BB><EFBFBD><EFBFBD>ݵ<EFBFBD><DDB5><EFBFBD><EFBFBD><EFBFBD>
|
||
* gpio_name : Ҫ<><D2AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD>GPIO<49><4F><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||
* if_get_user_set_flag : <20><>ȡ<EFBFBD><C8A1>־<EFBFBD><D6BE><EFBFBD><EFBFBD>ʾ<EFBFBD><CABE>ȡ<EFBFBD>û<EFBFBD><C3BB>趨<EFBFBD><E8B6A8><EFBFBD>ݻ<EFBFBD><DDBB><EFBFBD><EFBFBD><EFBFBD>ʵ<EFBFBD><CAB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||
* Returns :
|
||
*
|
||
* Notes :
|
||
*
|
||
**********************************************************************************************************************
|
||
*/
|
||
#ifdef SUNXI_R_PIO_BASE
|
||
__s32 gpio_get_one_pin_status(u32 p_handler, user_gpio_set_t *gpio_status, const char *gpio_name, __u32 if_get_from_hardware)
|
||
{
|
||
char *tmp_buf; //ת<><D7AA><EFBFBD><EFBFBD>char<61><72><EFBFBD><EFBFBD>
|
||
__u32 group_count_max; //<2F><><EFBFBD><EFBFBD>GPIO<49><4F><EFBFBD><EFBFBD>
|
||
system_gpio_set_t *user_gpio_set, *tmp_sys_gpio_data;
|
||
__u32 port_num_func, port_num_pull;
|
||
__u32 port, port_num;
|
||
__u32 i, tmp_val1, tmp_val2;
|
||
int cpus_flag = 0;
|
||
//<2F><><EFBFBD>鴫<EFBFBD><E9B4AB><EFBFBD>ľ<EFBFBD><C4BE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ч<EFBFBD><D0A7>
|
||
if((!p_handler) || (!gpio_status))
|
||
{
|
||
return EGPIO_FAIL;
|
||
}
|
||
tmp_buf = (char *)p_handler;
|
||
group_count_max = *(int *)tmp_buf;
|
||
if(group_count_max <= 0)
|
||
{
|
||
return EGPIO_FAIL;
|
||
}
|
||
else if((group_count_max > 1) && (!gpio_name))
|
||
{
|
||
return EGPIO_FAIL;
|
||
}
|
||
user_gpio_set = (system_gpio_set_t *)(tmp_buf + 16);
|
||
//<2F><>ȡ<EFBFBD>û<EFBFBD><C3BB><EFBFBD><EFBFBD><EFBFBD>
|
||
//<2F><>ʾ<EFBFBD><CABE>ȡ<EFBFBD>û<EFBFBD><C3BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||
for(i = 0; i < group_count_max; i++)
|
||
{
|
||
tmp_sys_gpio_data = user_gpio_set + i; //tmp_sys_gpio_dataָ<61><D6B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>GPIO<49>ռ<EFBFBD>
|
||
if(strcmp(gpio_name, tmp_sys_gpio_data->gpio_name))
|
||
{
|
||
continue;
|
||
}
|
||
strcpy(gpio_status->gpio_name, tmp_sys_gpio_data->gpio_name);
|
||
port = tmp_sys_gpio_data->port;
|
||
port_num = tmp_sys_gpio_data->port_num;
|
||
gpio_status->port = port; //<2F><><EFBFBD><EFBFBD>port<72><74><EFBFBD><EFBFBD>
|
||
gpio_status->port_num = port_num; //<2F><><EFBFBD><EFBFBD>port_num<75><6D><EFBFBD><EFBFBD>
|
||
if(port >= 12)
|
||
cpus_flag = 1;
|
||
else
|
||
cpus_flag = 0;
|
||
if(!if_get_from_hardware) //<2F><>ǰҪ<C7B0><D2AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>û<EFBFBD><C3BB><EFBFBD><EFBFBD>Ƶ<EFBFBD><C6B5><EFBFBD><EFBFBD><EFBFBD>
|
||
{
|
||
gpio_status->mul_sel = tmp_sys_gpio_data->user_gpio_status.mul_sel; //<2F><><EFBFBD>û<EFBFBD><C3BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD><D0B6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||
gpio_status->pull = tmp_sys_gpio_data->user_gpio_status.pull; //<2F><><EFBFBD>û<EFBFBD><C3BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD><D0B6><EFBFBD>pull<6C><6C><EFBFBD><EFBFBD>
|
||
gpio_status->drv_level = tmp_sys_gpio_data->user_gpio_status.drv_level; //<2F><><EFBFBD>û<EFBFBD><C3BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD><D0B6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||
gpio_status->data = tmp_sys_gpio_data->user_gpio_status.data; //<2F><><EFBFBD>û<EFBFBD><C3BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD><D0B6><EFBFBD>data<74><61><EFBFBD><EFBFBD>
|
||
}
|
||
else //<2F><>ǰ<EFBFBD><C7B0><EFBFBD><EFBFBD><EFBFBD>Ĵ<EFBFBD><C4B4><EFBFBD>ʵ<EFBFBD>ʵIJ<CAB5><C4B2><EFBFBD>
|
||
{
|
||
port_num_func = (port_num >> 3);
|
||
port_num_pull = (port_num >> 4);
|
||
|
||
tmp_val1 = ((port_num - (port_num_func << 3)) << 2);
|
||
tmp_val2 = ((port_num - (port_num_pull << 4)) << 1);
|
||
if(!cpus_flag)
|
||
{
|
||
gpio_status->mul_sel = (PIO_REG_CFG_VALUE(port, port_num_func)>>tmp_val1) & 0x07; //<2F><>Ӳ<EFBFBD><D3B2><EFBFBD>ж<EFBFBD><D0B6><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ܼĴ<DCBC><C4B4><EFBFBD>
|
||
gpio_status->pull = (PIO_REG_PULL_VALUE(port, port_num_pull)>>tmp_val2) & 0x03; //<2F><>Ӳ<EFBFBD><D3B2><EFBFBD>ж<EFBFBD><D0B6><EFBFBD>pull<6C>Ĵ<EFBFBD><C4B4><EFBFBD>
|
||
gpio_status->drv_level = (PIO_REG_DLEVEL_VALUE(port, port_num_pull)>>tmp_val2) & 0x03; //<2F><>Ӳ<EFBFBD><D3B2><EFBFBD>ж<EFBFBD><D0B6><EFBFBD>level<65>Ĵ<EFBFBD><C4B4><EFBFBD>
|
||
}
|
||
else
|
||
{
|
||
gpio_status->mul_sel = (R_PIO_REG_CFG_VALUE(port, port_num_func)>>tmp_val1) & 0x07; //<2F><>Ӳ<EFBFBD><D3B2><EFBFBD>ж<EFBFBD><D0B6><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ܼĴ<DCBC><C4B4><EFBFBD>
|
||
gpio_status->pull = (R_PIO_REG_PULL_VALUE(port, port_num_pull)>>tmp_val2) & 0x03; //<2F><>Ӳ<EFBFBD><D3B2><EFBFBD>ж<EFBFBD><D0B6><EFBFBD>pull<6C>Ĵ<EFBFBD><C4B4><EFBFBD>
|
||
gpio_status->drv_level = (R_PIO_REG_DLEVEL_VALUE(port, port_num_pull)>>tmp_val2) & 0x03; //<2F><>Ӳ<EFBFBD><D3B2><EFBFBD>ж<EFBFBD><D0B6><EFBFBD>level<65>Ĵ<EFBFBD><C4B4><EFBFBD>
|
||
}
|
||
if(gpio_status->mul_sel <= 1)
|
||
{
|
||
if(!cpus_flag)
|
||
gpio_status->data = (PIO_REG_DATA_VALUE(port) >> port_num) & 0x01; //<2F><>Ӳ<EFBFBD><D3B2><EFBFBD>ж<EFBFBD><D0B6><EFBFBD>data<74>Ĵ<EFBFBD><C4B4><EFBFBD>
|
||
else
|
||
gpio_status->data = (R_PIO_REG_DATA_VALUE(port)>> port_num) & 0x01;
|
||
}
|
||
else
|
||
{
|
||
gpio_status->data = -1;
|
||
}
|
||
}
|
||
|
||
break;
|
||
}
|
||
|
||
return EGPIO_SUCCESS;
|
||
}
|
||
#else
|
||
__s32 gpio_get_one_pin_status(u32 p_handler, user_gpio_set_t *gpio_status, const char *gpio_name, __u32 if_get_from_hardware)
|
||
{
|
||
char *tmp_buf; //ת<><D7AA><EFBFBD><EFBFBD>char<61><72><EFBFBD><EFBFBD>
|
||
__u32 group_count_max; //<2F><><EFBFBD><EFBFBD>GPIO<49><4F><EFBFBD><EFBFBD>
|
||
system_gpio_set_t *user_gpio_set, *tmp_sys_gpio_data;
|
||
__u32 port_num_func, port_num_pull;
|
||
__u32 port, port_num;
|
||
__u32 i, tmp_val1, tmp_val2;
|
||
|
||
//<2F><><EFBFBD>鴫<EFBFBD><E9B4AB><EFBFBD>ľ<EFBFBD><C4BE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ч<EFBFBD><D0A7>
|
||
if((!p_handler) || (!gpio_status))
|
||
{
|
||
return EGPIO_FAIL;
|
||
}
|
||
tmp_buf = (char *)p_handler;
|
||
group_count_max = *(int *)tmp_buf;
|
||
if(group_count_max <= 0)
|
||
{
|
||
return EGPIO_FAIL;
|
||
}
|
||
else if((group_count_max > 1) && (!gpio_name))
|
||
{
|
||
return EGPIO_FAIL;
|
||
}
|
||
user_gpio_set = (system_gpio_set_t *)(tmp_buf + 16);
|
||
//<2F><>ȡ<EFBFBD>û<EFBFBD><C3BB><EFBFBD><EFBFBD><EFBFBD>
|
||
//<2F><>ʾ<EFBFBD><CABE>ȡ<EFBFBD>û<EFBFBD><C3BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||
for(i = 0; i < group_count_max; i++)
|
||
{
|
||
tmp_sys_gpio_data = user_gpio_set + i; //tmp_sys_gpio_dataָ<61><D6B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>GPIO<49>ռ<EFBFBD>
|
||
if(strcmp(gpio_name, tmp_sys_gpio_data->gpio_name))
|
||
{
|
||
continue;
|
||
}
|
||
strcpy(gpio_status->gpio_name, tmp_sys_gpio_data->gpio_name);
|
||
port = tmp_sys_gpio_data->port;
|
||
port_num = tmp_sys_gpio_data->port_num;
|
||
gpio_status->port = port; //<2F><><EFBFBD><EFBFBD>port<72><74><EFBFBD><EFBFBD>
|
||
gpio_status->port_num = port_num; //<2F><><EFBFBD><EFBFBD>port_num<75><6D><EFBFBD><EFBFBD>
|
||
|
||
if(!if_get_from_hardware) //<2F><>ǰҪ<C7B0><D2AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>û<EFBFBD><C3BB><EFBFBD><EFBFBD>Ƶ<EFBFBD><C6B5><EFBFBD><EFBFBD><EFBFBD>
|
||
{
|
||
gpio_status->mul_sel = tmp_sys_gpio_data->user_gpio_status.mul_sel; //<2F><><EFBFBD>û<EFBFBD><C3BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD><D0B6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||
gpio_status->pull = tmp_sys_gpio_data->user_gpio_status.pull; //<2F><><EFBFBD>û<EFBFBD><C3BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD><D0B6><EFBFBD>pull<6C><6C><EFBFBD><EFBFBD>
|
||
gpio_status->drv_level = tmp_sys_gpio_data->user_gpio_status.drv_level; //<2F><><EFBFBD>û<EFBFBD><C3BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD><D0B6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||
gpio_status->data = tmp_sys_gpio_data->user_gpio_status.data; //<2F><><EFBFBD>û<EFBFBD><C3BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD><D0B6><EFBFBD>data<74><61><EFBFBD><EFBFBD>
|
||
}
|
||
else //<2F><>ǰ<EFBFBD><C7B0><EFBFBD><EFBFBD><EFBFBD>Ĵ<EFBFBD><C4B4><EFBFBD>ʵ<EFBFBD>ʵIJ<CAB5><C4B2><EFBFBD>
|
||
{
|
||
port_num_func = (port_num >> 3);
|
||
port_num_pull = (port_num >> 4);
|
||
|
||
tmp_val1 = ((port_num - (port_num_func << 3)) << 2);
|
||
tmp_val2 = ((port_num - (port_num_pull << 4)) << 1);
|
||
gpio_status->mul_sel = (PIO_REG_CFG_VALUE(port, port_num_func)>>tmp_val1) & 0x07; //<2F><>Ӳ<EFBFBD><D3B2><EFBFBD>ж<EFBFBD><D0B6><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ܼĴ<DCBC><C4B4><EFBFBD>
|
||
gpio_status->pull = (PIO_REG_PULL_VALUE(port, port_num_pull)>>tmp_val2) & 0x03; //<2F><>Ӳ<EFBFBD><D3B2><EFBFBD>ж<EFBFBD><D0B6><EFBFBD>pull<6C>Ĵ<EFBFBD><C4B4><EFBFBD>
|
||
gpio_status->drv_level = (PIO_REG_DLEVEL_VALUE(port, port_num_pull)>>tmp_val2) & 0x03; //<2F><>Ӳ<EFBFBD><D3B2><EFBFBD>ж<EFBFBD><D0B6><EFBFBD>level<65>Ĵ<EFBFBD><C4B4><EFBFBD>
|
||
if(gpio_status->mul_sel <= 1)
|
||
{
|
||
gpio_status->data = (PIO_REG_DATA_VALUE(port) >> port_num) & 0x01; //<2F><>Ӳ<EFBFBD><D3B2><EFBFBD>ж<EFBFBD><D0B6><EFBFBD>data<74>Ĵ<EFBFBD><C4B4><EFBFBD>
|
||
}
|
||
else
|
||
{
|
||
gpio_status->data = -1;
|
||
}
|
||
}
|
||
|
||
break;
|
||
}
|
||
|
||
return EGPIO_SUCCESS;
|
||
}
|
||
|
||
#endif
|
||
/*
|
||
**********************************************************************************************************************
|
||
* CSP_PIN_Set_One_Gpio_Status
|
||
*
|
||
* Description:
|
||
* <20><>ȡ<EFBFBD>û<EFBFBD><C3BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>GPIO<49><4F>ijһ<C4B3><D2BB><EFBFBD><EFBFBD>״̬
|
||
* Arguments :
|
||
* p_handler : handler
|
||
* gpio_status : <20><><EFBFBD><EFBFBD><EFBFBD>û<EFBFBD><C3BB><EFBFBD><EFBFBD>ݵ<EFBFBD><DDB5><EFBFBD><EFBFBD><EFBFBD>
|
||
* gpio_name : Ҫ<><D2AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD>GPIO<49><4F><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||
* if_get_user_set_flag : <20><>ȡ<EFBFBD><C8A1>־<EFBFBD><D6BE><EFBFBD><EFBFBD>ʾ<EFBFBD><CABE>ȡ<EFBFBD>û<EFBFBD><C3BB>趨<EFBFBD><E8B6A8><EFBFBD>ݻ<EFBFBD><DDBB><EFBFBD><EFBFBD><EFBFBD>ʵ<EFBFBD><CAB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||
* Returns :
|
||
*
|
||
* Notes :
|
||
*
|
||
**********************************************************************************************************************
|
||
*/
|
||
#ifdef SUNXI_R_PIO_BASE
|
||
__s32 gpio_set_one_pin_status(u32 p_handler, user_gpio_set_t *gpio_status, const char *gpio_name, __u32 if_set_to_current_input_status)
|
||
{
|
||
char *tmp_buf; //ת<><D7AA><EFBFBD><EFBFBD>char<61><72><EFBFBD><EFBFBD>
|
||
__u32 group_count_max; //<2F><><EFBFBD><EFBFBD>GPIO<49><4F><EFBFBD><EFBFBD>
|
||
system_gpio_set_t *user_gpio_set, *tmp_sys_gpio_data;
|
||
user_gpio_set_t script_gpio;
|
||
volatile __u32 *tmp_addr;
|
||
__u32 port_num_func, port_num_pull;
|
||
__u32 port, port_num;
|
||
__u32 i, reg_val, tmp_val;
|
||
int cpus_flag = 0;
|
||
//<2F><><EFBFBD>鴫<EFBFBD><E9B4AB><EFBFBD>ľ<EFBFBD><C4BE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ч<EFBFBD><D0A7>
|
||
if((!p_handler) || (!gpio_name))
|
||
{
|
||
return EGPIO_FAIL;
|
||
}
|
||
if((if_set_to_current_input_status) && (!gpio_status))
|
||
{
|
||
return EGPIO_FAIL;
|
||
}
|
||
tmp_buf = (char *)p_handler;
|
||
group_count_max = *(int *)tmp_buf;
|
||
if(group_count_max <= 0)
|
||
{
|
||
return EGPIO_FAIL;
|
||
}
|
||
user_gpio_set = (system_gpio_set_t *)(tmp_buf + 16);
|
||
//<2F><>ȡ<EFBFBD>û<EFBFBD><C3BB><EFBFBD><EFBFBD><EFBFBD>
|
||
//<2F><>ʾ<EFBFBD><CABE>ȡ<EFBFBD>û<EFBFBD><C3BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||
for(i = 0; i < group_count_max; i++)
|
||
{
|
||
tmp_sys_gpio_data = user_gpio_set + i; //tmp_sys_gpio_dataָ<61><D6B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>GPIO<49>ռ<EFBFBD>
|
||
if(strcmp(gpio_name, tmp_sys_gpio_data->gpio_name))
|
||
{
|
||
continue;
|
||
}
|
||
|
||
port = tmp_sys_gpio_data->port; //<2F><><EFBFBD><EFBFBD>port<72><74><EFBFBD><EFBFBD>
|
||
port_num = tmp_sys_gpio_data->port_num; //<2F><><EFBFBD><EFBFBD>port_num<75><6D><EFBFBD><EFBFBD>
|
||
port_num_func = (port_num >> 3);
|
||
port_num_pull = (port_num >> 4);
|
||
if(port >= 12)
|
||
cpus_flag = 1;
|
||
else
|
||
cpus_flag = 0;
|
||
if(if_set_to_current_input_status) //<2F><><EFBFBD>ݵ<EFBFBD>ǰ<EFBFBD>û<EFBFBD><C3BB>趨<EFBFBD><E8B6A8><EFBFBD><EFBFBD>
|
||
{
|
||
//<2F><EFBFBD>FUCN<43>Ĵ<EFBFBD><C4B4><EFBFBD>
|
||
script_gpio.mul_sel = gpio_status->mul_sel;
|
||
script_gpio.pull = gpio_status->pull;
|
||
script_gpio.drv_level = gpio_status->drv_level;
|
||
script_gpio.data = gpio_status->data;
|
||
}
|
||
else
|
||
{
|
||
script_gpio.mul_sel = tmp_sys_gpio_data->user_gpio_status.mul_sel;
|
||
script_gpio.pull = tmp_sys_gpio_data->user_gpio_status.pull;
|
||
script_gpio.drv_level = tmp_sys_gpio_data->user_gpio_status.drv_level;
|
||
script_gpio.data = tmp_sys_gpio_data->user_gpio_status.data;
|
||
}
|
||
|
||
if(script_gpio.mul_sel >= 0)
|
||
{
|
||
if(!cpus_flag)
|
||
tmp_addr = PIO_REG_CFG(port, port_num_func);
|
||
else
|
||
tmp_addr = R_PIO_REG_CFG(port, port_num_func);
|
||
reg_val = GPIO_REG_READ(tmp_addr); //<2F><EFBFBD>FUNC<4E>Ĵ<EFBFBD><C4B4><EFBFBD>
|
||
tmp_val = (port_num - (port_num_func<<3))<<2;
|
||
reg_val &= ~(0x07 << tmp_val);
|
||
reg_val |= (script_gpio.mul_sel) << tmp_val;
|
||
GPIO_REG_WRITE(tmp_addr, reg_val);
|
||
}
|
||
//<2F><EFBFBD>PULL<4C>Ĵ<EFBFBD><C4B4><EFBFBD>
|
||
if(script_gpio.pull >= 0)
|
||
{
|
||
if(!cpus_flag)
|
||
tmp_addr = PIO_REG_PULL(port, port_num_pull);
|
||
else
|
||
tmp_addr = R_PIO_REG_PULL(port, port_num_pull);
|
||
reg_val = GPIO_REG_READ(tmp_addr); //<2F><EFBFBD>FUNC<4E>Ĵ<EFBFBD><C4B4><EFBFBD>
|
||
tmp_val = (port_num - (port_num_pull<<4))<<1;
|
||
reg_val &= ~(0x03 << tmp_val);
|
||
reg_val |= (script_gpio.pull) << tmp_val;
|
||
GPIO_REG_WRITE(tmp_addr, reg_val);
|
||
}
|
||
//<2F><EFBFBD>DLEVEL<45>Ĵ<EFBFBD><C4B4><EFBFBD>
|
||
if(script_gpio.drv_level >= 0)
|
||
{
|
||
if(!cpus_flag)
|
||
tmp_addr = PIO_REG_DLEVEL(port, port_num_pull);
|
||
else
|
||
tmp_addr = R_PIO_REG_DLEVEL(port, port_num_pull);
|
||
reg_val = GPIO_REG_READ(tmp_addr); //<2F><EFBFBD>FUNC<4E>Ĵ<EFBFBD><C4B4><EFBFBD>
|
||
tmp_val = (port_num - (port_num_pull<<4))<<1;
|
||
reg_val &= ~(0x03 << tmp_val);
|
||
reg_val |= (script_gpio.drv_level) << tmp_val;
|
||
GPIO_REG_WRITE(tmp_addr, reg_val);
|
||
}
|
||
//<2F><EFBFBD>data<74>Ĵ<EFBFBD><C4B4><EFBFBD>
|
||
if(script_gpio.mul_sel == 1)
|
||
{
|
||
if(script_gpio.data >= 0)
|
||
{
|
||
if(!cpus_flag)
|
||
tmp_addr = PIO_REG_DATA(port);
|
||
else
|
||
tmp_addr = R_PIO_REG_DATA(port);
|
||
reg_val = GPIO_REG_READ(tmp_addr);; //<2F><EFBFBD>DATA<54>Ĵ<EFBFBD><C4B4><EFBFBD>
|
||
reg_val &= ~(0x01 << port_num);
|
||
reg_val |= (script_gpio.data & 0x01) << port_num;
|
||
GPIO_REG_WRITE(tmp_addr, reg_val);
|
||
}
|
||
}
|
||
|
||
break;
|
||
}
|
||
|
||
return EGPIO_SUCCESS;
|
||
}
|
||
#else
|
||
__s32 gpio_set_one_pin_status(u32 p_handler, user_gpio_set_t *gpio_status, const char *gpio_name, __u32 if_set_to_current_input_status)
|
||
{
|
||
char *tmp_buf; //ת<><D7AA><EFBFBD><EFBFBD>char<61><72><EFBFBD><EFBFBD>
|
||
__u32 group_count_max; //<2F><><EFBFBD><EFBFBD>GPIO<49><4F><EFBFBD><EFBFBD>
|
||
system_gpio_set_t *user_gpio_set, *tmp_sys_gpio_data;
|
||
user_gpio_set_t script_gpio;
|
||
volatile __u32 *tmp_addr;
|
||
__u32 port_num_func, port_num_pull;
|
||
__u32 port, port_num;
|
||
__u32 i, reg_val, tmp_val;
|
||
|
||
//<2F><><EFBFBD>鴫<EFBFBD><E9B4AB><EFBFBD>ľ<EFBFBD><C4BE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ч<EFBFBD><D0A7>
|
||
if((!p_handler) || (!gpio_name))
|
||
{
|
||
return EGPIO_FAIL;
|
||
}
|
||
if((if_set_to_current_input_status) && (!gpio_status))
|
||
{
|
||
return EGPIO_FAIL;
|
||
}
|
||
tmp_buf = (char *)p_handler;
|
||
group_count_max = *(int *)tmp_buf;
|
||
if(group_count_max <= 0)
|
||
{
|
||
return EGPIO_FAIL;
|
||
}
|
||
user_gpio_set = (system_gpio_set_t *)(tmp_buf + 16);
|
||
//<2F><>ȡ<EFBFBD>û<EFBFBD><C3BB><EFBFBD><EFBFBD><EFBFBD>
|
||
//<2F><>ʾ<EFBFBD><CABE>ȡ<EFBFBD>û<EFBFBD><C3BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||
for(i = 0; i < group_count_max; i++)
|
||
{
|
||
tmp_sys_gpio_data = user_gpio_set + i; //tmp_sys_gpio_dataָ<61><D6B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>GPIO<49>ռ<EFBFBD>
|
||
if(strcmp(gpio_name, tmp_sys_gpio_data->gpio_name))
|
||
{
|
||
continue;
|
||
}
|
||
|
||
port = tmp_sys_gpio_data->port; //<2F><><EFBFBD><EFBFBD>port<72><74><EFBFBD><EFBFBD>
|
||
port_num = tmp_sys_gpio_data->port_num; //<2F><><EFBFBD><EFBFBD>port_num<75><6D><EFBFBD><EFBFBD>
|
||
port_num_func = (port_num >> 3);
|
||
port_num_pull = (port_num >> 4);
|
||
|
||
if(if_set_to_current_input_status) //<2F><><EFBFBD>ݵ<EFBFBD>ǰ<EFBFBD>û<EFBFBD><C3BB>趨<EFBFBD><E8B6A8><EFBFBD><EFBFBD>
|
||
{
|
||
//<2F><EFBFBD>FUCN<43>Ĵ<EFBFBD><C4B4><EFBFBD>
|
||
script_gpio.mul_sel = gpio_status->mul_sel;
|
||
script_gpio.pull = gpio_status->pull;
|
||
script_gpio.drv_level = gpio_status->drv_level;
|
||
script_gpio.data = gpio_status->data;
|
||
}
|
||
else
|
||
{
|
||
script_gpio.mul_sel = tmp_sys_gpio_data->user_gpio_status.mul_sel;
|
||
script_gpio.pull = tmp_sys_gpio_data->user_gpio_status.pull;
|
||
script_gpio.drv_level = tmp_sys_gpio_data->user_gpio_status.drv_level;
|
||
script_gpio.data = tmp_sys_gpio_data->user_gpio_status.data;
|
||
}
|
||
|
||
if(script_gpio.mul_sel >= 0)
|
||
{
|
||
tmp_addr = PIO_REG_CFG(port, port_num_func);
|
||
reg_val = GPIO_REG_READ(tmp_addr); //<2F><EFBFBD>FUNC<4E>Ĵ<EFBFBD><C4B4><EFBFBD>
|
||
tmp_val = (port_num - (port_num_func<<3))<<2;
|
||
reg_val &= ~(0x07 << tmp_val);
|
||
reg_val |= (script_gpio.mul_sel) << tmp_val;
|
||
GPIO_REG_WRITE(tmp_addr, reg_val);
|
||
}
|
||
//<2F><EFBFBD>PULL<4C>Ĵ<EFBFBD><C4B4><EFBFBD>
|
||
if(script_gpio.pull >= 0)
|
||
{
|
||
tmp_addr = PIO_REG_PULL(port, port_num_pull);
|
||
reg_val = GPIO_REG_READ(tmp_addr); //<2F><EFBFBD>FUNC<4E>Ĵ<EFBFBD><C4B4><EFBFBD>
|
||
tmp_val = (port_num - (port_num_pull<<4))<<1;
|
||
reg_val &= ~(0x03 << tmp_val);
|
||
reg_val |= (script_gpio.pull) << tmp_val;
|
||
GPIO_REG_WRITE(tmp_addr, reg_val);
|
||
}
|
||
//<2F><EFBFBD>DLEVEL<45>Ĵ<EFBFBD><C4B4><EFBFBD>
|
||
if(script_gpio.drv_level >= 0)
|
||
{
|
||
tmp_addr = PIO_REG_DLEVEL(port, port_num_pull);
|
||
reg_val = GPIO_REG_READ(tmp_addr); //<2F><EFBFBD>FUNC<4E>Ĵ<EFBFBD><C4B4><EFBFBD>
|
||
tmp_val = (port_num - (port_num_pull<<4))<<1;
|
||
reg_val &= ~(0x03 << tmp_val);
|
||
reg_val |= (script_gpio.drv_level) << tmp_val;
|
||
GPIO_REG_WRITE(tmp_addr, reg_val);
|
||
}
|
||
//<2F><EFBFBD>data<74>Ĵ<EFBFBD><C4B4><EFBFBD>
|
||
if(script_gpio.mul_sel == 1)
|
||
{
|
||
if(script_gpio.data >= 0)
|
||
{
|
||
tmp_addr = PIO_REG_DATA(port);
|
||
reg_val = GPIO_REG_READ(tmp_addr); //<2F><EFBFBD>DATA<54>Ĵ<EFBFBD><C4B4><EFBFBD>
|
||
reg_val &= ~(0x01 << port_num);
|
||
reg_val |= (script_gpio.data & 0x01) << port_num;
|
||
GPIO_REG_WRITE(tmp_addr, reg_val);
|
||
}
|
||
}
|
||
|
||
break;
|
||
}
|
||
|
||
return EGPIO_SUCCESS;
|
||
}
|
||
#endif
|
||
/*
|
||
**********************************************************************************************************************
|
||
* CSP_GPIO_Set_One_PIN_IO_Status
|
||
*
|
||
* Description:
|
||
* <20><EFBFBD><DEB8>û<EFBFBD><C3BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>GPIO<49>е<EFBFBD>ijһ<C4B3><D2BB>IO<49>ڵģ<DAB5><C4A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>״̬
|
||
* Arguments :
|
||
* p_handler : handler
|
||
* if_set_to_output_status : <20><><EFBFBD>ó<EFBFBD><C3B3><EFBFBD><EFBFBD><EFBFBD>״̬<D7B4><CCAC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>״̬
|
||
* gpio_name : Ҫ<><D2AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD>GPIO<49><4F><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||
* Returns :
|
||
*
|
||
* Notes :
|
||
*
|
||
**********************************************************************************************************************
|
||
*/
|
||
#ifdef SUNXI_R_PIO_BASE
|
||
__s32 gpio_set_one_pin_io_status(u32 p_handler, __u32 if_set_to_output_status, const char *gpio_name)
|
||
{
|
||
char *tmp_buf; //ת<><D7AA><EFBFBD><EFBFBD>char<61><72><EFBFBD><EFBFBD>
|
||
__u32 group_count_max; //<2F><><EFBFBD><EFBFBD>GPIO<49><4F><EFBFBD><EFBFBD>
|
||
system_gpio_set_t *user_gpio_set = NULL, *tmp_sys_gpio_data;
|
||
volatile __u32 *tmp_group_func_addr = NULL;
|
||
__u32 port, port_num, port_num_func;
|
||
__u32 i, reg_val;
|
||
int cpus_flag = 0;
|
||
//<2F><><EFBFBD>鴫<EFBFBD><E9B4AB><EFBFBD>ľ<EFBFBD><C4BE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ч<EFBFBD><D0A7>
|
||
if(!p_handler)
|
||
{
|
||
return EGPIO_FAIL;
|
||
}
|
||
if(if_set_to_output_status > 1)
|
||
{
|
||
return EGPIO_FAIL;
|
||
}
|
||
tmp_buf = (char *)p_handler;
|
||
group_count_max = *(int *)tmp_buf;
|
||
tmp_sys_gpio_data = (system_gpio_set_t *)(tmp_buf + 16);
|
||
if(group_count_max == 0)
|
||
{
|
||
return EGPIO_FAIL;
|
||
}
|
||
else if(group_count_max == 1)
|
||
{
|
||
user_gpio_set = tmp_sys_gpio_data;
|
||
}
|
||
else if(gpio_name)
|
||
{
|
||
for(i=0; i<group_count_max; i++)
|
||
{
|
||
if(strcmp(gpio_name, tmp_sys_gpio_data->gpio_name))
|
||
{
|
||
tmp_sys_gpio_data ++;
|
||
continue;
|
||
}
|
||
user_gpio_set = tmp_sys_gpio_data;
|
||
break;
|
||
}
|
||
}
|
||
if(!user_gpio_set)
|
||
{
|
||
return EGPIO_FAIL;
|
||
}
|
||
|
||
port = user_gpio_set->port;
|
||
port_num = user_gpio_set->port_num;
|
||
port_num_func = port_num >> 3;
|
||
if(port >= 12)
|
||
cpus_flag = 1;
|
||
if(!cpus_flag)
|
||
tmp_group_func_addr = PIO_REG_CFG(port, port_num_func);
|
||
else
|
||
tmp_group_func_addr = R_PIO_REG_CFG(port, port_num_func);
|
||
|
||
reg_val = GPIO_REG_READ(tmp_group_func_addr);
|
||
reg_val &= ~(0x07 << (((port_num - (port_num_func<<3))<<2)));
|
||
reg_val |= if_set_to_output_status << (((port_num - (port_num_func<<3))<<2));
|
||
GPIO_REG_WRITE(tmp_group_func_addr, reg_val);
|
||
|
||
return EGPIO_SUCCESS;
|
||
}
|
||
#else
|
||
__s32 gpio_set_one_pin_io_status(u32 p_handler, __u32 if_set_to_output_status, const char *gpio_name)
|
||
{
|
||
char *tmp_buf; //ת<><D7AA><EFBFBD><EFBFBD>char<61><72><EFBFBD><EFBFBD>
|
||
__u32 group_count_max; //<2F><><EFBFBD><EFBFBD>GPIO<49><4F><EFBFBD><EFBFBD>
|
||
system_gpio_set_t *user_gpio_set = NULL, *tmp_sys_gpio_data;
|
||
volatile __u32 *tmp_group_func_addr = NULL;
|
||
__u32 port, port_num, port_num_func;
|
||
__u32 i, reg_val;
|
||
|
||
//<2F><><EFBFBD>鴫<EFBFBD><E9B4AB><EFBFBD>ľ<EFBFBD><C4BE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ч<EFBFBD><D0A7>
|
||
if(!p_handler)
|
||
{
|
||
return EGPIO_FAIL;
|
||
}
|
||
if(if_set_to_output_status > 1)
|
||
{
|
||
return EGPIO_FAIL;
|
||
}
|
||
tmp_buf = (char *)p_handler;
|
||
group_count_max = *(int *)tmp_buf;
|
||
tmp_sys_gpio_data = (system_gpio_set_t *)(tmp_buf + 16);
|
||
if(group_count_max == 0)
|
||
{
|
||
return EGPIO_FAIL;
|
||
}
|
||
else if(group_count_max == 1)
|
||
{
|
||
user_gpio_set = tmp_sys_gpio_data;
|
||
}
|
||
else if(gpio_name)
|
||
{
|
||
for(i=0; i<group_count_max; i++)
|
||
{
|
||
if(strcmp(gpio_name, tmp_sys_gpio_data->gpio_name))
|
||
{
|
||
tmp_sys_gpio_data ++;
|
||
continue;
|
||
}
|
||
user_gpio_set = tmp_sys_gpio_data;
|
||
break;
|
||
}
|
||
}
|
||
if(!user_gpio_set)
|
||
{
|
||
return EGPIO_FAIL;
|
||
}
|
||
|
||
port = user_gpio_set->port;
|
||
port_num = user_gpio_set->port_num;
|
||
port_num_func = port_num >> 3;
|
||
|
||
tmp_group_func_addr = PIO_REG_CFG(port, port_num_func);
|
||
reg_val = GPIO_REG_READ(tmp_group_func_addr);
|
||
reg_val &= ~(0x07 << (((port_num - (port_num_func<<3))<<2)));
|
||
reg_val |= if_set_to_output_status << (((port_num - (port_num_func<<3))<<2));
|
||
GPIO_REG_WRITE(tmp_group_func_addr, reg_val);
|
||
|
||
return EGPIO_SUCCESS;
|
||
}
|
||
|
||
|
||
#endif
|
||
/*
|
||
**********************************************************************************************************************
|
||
* CSP_GPIO_Set_One_PIN_Pull
|
||
*
|
||
* Description:
|
||
* <20><EFBFBD><DEB8>û<EFBFBD><C3BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>GPIO<49>е<EFBFBD>ijһ<C4B3><D2BB>IO<49>ڵģ<DAB5>PULL״̬
|
||
* Arguments :
|
||
* p_handler : handler
|
||
* if_set_to_output_status : <20><><EFBFBD><EFBFBD><EFBFBD>õ<EFBFBD>pull״̬
|
||
* gpio_name : Ҫ<><D2AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD>GPIO<49><4F><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||
* Returns :
|
||
*
|
||
* Notes :
|
||
*
|
||
**********************************************************************************************************************
|
||
*/
|
||
#ifdef SUNXI_R_PIO_BASE
|
||
__s32 gpio_set_one_pin_pull(u32 p_handler, __u32 set_pull_status, const char *gpio_name)
|
||
{
|
||
char *tmp_buf; //ת<><D7AA><EFBFBD><EFBFBD>char<61><72><EFBFBD><EFBFBD>
|
||
__u32 group_count_max; //<2F><><EFBFBD><EFBFBD>GPIO<49><4F><EFBFBD><EFBFBD>
|
||
system_gpio_set_t *user_gpio_set = NULL, *tmp_sys_gpio_data;
|
||
volatile __u32 *tmp_group_pull_addr = NULL;
|
||
__u32 port, port_num, port_num_pull;
|
||
__u32 i, reg_val;
|
||
int cpus_flag = 0;
|
||
//<2F><><EFBFBD>鴫<EFBFBD><E9B4AB><EFBFBD>ľ<EFBFBD><C4BE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ч<EFBFBD><D0A7>
|
||
if(!p_handler)
|
||
{
|
||
return EGPIO_FAIL;
|
||
}
|
||
if(set_pull_status >= 4)
|
||
{
|
||
return EGPIO_FAIL;
|
||
}
|
||
tmp_buf = (char *)p_handler;
|
||
group_count_max = *(int *)tmp_buf;
|
||
tmp_sys_gpio_data = (system_gpio_set_t *)(tmp_buf + 16);
|
||
if(group_count_max == 0)
|
||
{
|
||
return EGPIO_FAIL;
|
||
}
|
||
else if(group_count_max == 1)
|
||
{
|
||
user_gpio_set = tmp_sys_gpio_data;
|
||
}
|
||
else if(gpio_name)
|
||
{
|
||
for(i=0; i<group_count_max; i++)
|
||
{
|
||
if(strcmp(gpio_name, tmp_sys_gpio_data->gpio_name))
|
||
{
|
||
tmp_sys_gpio_data ++;
|
||
continue;
|
||
}
|
||
user_gpio_set = tmp_sys_gpio_data;
|
||
break;
|
||
}
|
||
}
|
||
if(!user_gpio_set)
|
||
{
|
||
return EGPIO_FAIL;
|
||
}
|
||
|
||
port = user_gpio_set->port;
|
||
port_num = user_gpio_set->port_num;
|
||
port_num_pull = port_num >> 4;
|
||
|
||
if(port >= 12)
|
||
cpus_flag = 1;
|
||
if(!cpus_flag)
|
||
tmp_group_pull_addr = PIO_REG_DLEVEL(port, port_num_pull);
|
||
else
|
||
tmp_group_pull_addr = R_PIO_REG_DLEVEL(port,port_num_pull);
|
||
|
||
reg_val = GPIO_REG_READ(tmp_group_pull_addr);
|
||
reg_val &= ~(0x03 << (((port_num - (port_num_pull<<4))<<1)));
|
||
reg_val |= (set_pull_status << (((port_num - (port_num_pull<<4))<<1)));
|
||
GPIO_REG_WRITE(tmp_group_pull_addr, reg_val);
|
||
|
||
return EGPIO_SUCCESS;
|
||
}
|
||
#else
|
||
__s32 gpio_set_one_pin_pull(u32 p_handler, __u32 set_pull_status, const char *gpio_name)
|
||
{
|
||
char *tmp_buf; //ת<><D7AA><EFBFBD><EFBFBD>char<61><72><EFBFBD><EFBFBD>
|
||
__u32 group_count_max; //<2F><><EFBFBD><EFBFBD>GPIO<49><4F><EFBFBD><EFBFBD>
|
||
system_gpio_set_t *user_gpio_set = NULL, *tmp_sys_gpio_data;
|
||
volatile __u32 *tmp_group_pull_addr = NULL;
|
||
__u32 port, port_num, port_num_pull;
|
||
__u32 i, reg_val;
|
||
//<2F><><EFBFBD>鴫<EFBFBD><E9B4AB><EFBFBD>ľ<EFBFBD><C4BE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ч<EFBFBD><D0A7>
|
||
if(!p_handler)
|
||
{
|
||
return EGPIO_FAIL;
|
||
}
|
||
if(set_pull_status >= 4)
|
||
{
|
||
return EGPIO_FAIL;
|
||
}
|
||
tmp_buf = (char *)p_handler;
|
||
group_count_max = *(int *)tmp_buf;
|
||
tmp_sys_gpio_data = (system_gpio_set_t *)(tmp_buf + 16);
|
||
if(group_count_max == 0)
|
||
{
|
||
return EGPIO_FAIL;
|
||
}
|
||
else if(group_count_max == 1)
|
||
{
|
||
user_gpio_set = tmp_sys_gpio_data;
|
||
}
|
||
else if(gpio_name)
|
||
{
|
||
for(i=0; i<group_count_max; i++)
|
||
{
|
||
if(strcmp(gpio_name, tmp_sys_gpio_data->gpio_name))
|
||
{
|
||
tmp_sys_gpio_data ++;
|
||
continue;
|
||
}
|
||
user_gpio_set = tmp_sys_gpio_data;
|
||
break;
|
||
}
|
||
}
|
||
if(!user_gpio_set)
|
||
{
|
||
return EGPIO_FAIL;
|
||
}
|
||
|
||
port = user_gpio_set->port;
|
||
port_num = user_gpio_set->port_num;
|
||
port_num_pull = port_num >> 4;
|
||
|
||
tmp_group_pull_addr = PIO_REG_PULL(port, port_num_pull);
|
||
reg_val = GPIO_REG_READ(tmp_group_pull_addr);
|
||
reg_val &= ~(0x03 << (((port_num - (port_num_pull<<4))<<1)));
|
||
reg_val |= (set_pull_status << (((port_num - (port_num_pull<<4))<<1)));
|
||
GPIO_REG_WRITE(tmp_group_pull_addr, reg_val);
|
||
|
||
return EGPIO_SUCCESS;
|
||
}
|
||
#endif
|
||
/*
|
||
**********************************************************************************************************************
|
||
* CSP_GPIO_Set_One_PIN_driver_level
|
||
*
|
||
* Description:
|
||
* <20><EFBFBD><DEB8>û<EFBFBD><C3BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>GPIO<49>е<EFBFBD>ijһ<C4B3><D2BB>IO<49>ڵģ<DAB5><C4A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||
* Arguments :
|
||
* p_handler : handler
|
||
* if_set_to_output_status : <20><><EFBFBD><EFBFBD><EFBFBD>õ<EFBFBD><C3B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȼ<EFBFBD>
|
||
* gpio_name : Ҫ<><D2AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD>GPIO<49><4F><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||
* Returns :
|
||
*
|
||
* Notes :
|
||
*
|
||
**********************************************************************************************************************
|
||
*/
|
||
#ifdef SUNXI_R_PIO_BASE
|
||
__s32 gpio_set_one_pin_driver_level(u32 p_handler, __u32 set_driver_level, const char *gpio_name)
|
||
{
|
||
char *tmp_buf; //ת<><D7AA><EFBFBD><EFBFBD>char<61><72><EFBFBD><EFBFBD>
|
||
__u32 group_count_max; //<2F><><EFBFBD><EFBFBD>GPIO<49><4F><EFBFBD><EFBFBD>
|
||
system_gpio_set_t *user_gpio_set = NULL, *tmp_sys_gpio_data;
|
||
volatile __u32 *tmp_group_dlevel_addr = NULL;
|
||
__u32 port, port_num, port_num_dlevel;
|
||
__u32 i, reg_val;
|
||
int cpus_flag = 0;
|
||
//<2F><><EFBFBD>鴫<EFBFBD><E9B4AB><EFBFBD>ľ<EFBFBD><C4BE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ч<EFBFBD><D0A7>
|
||
if(!p_handler)
|
||
{
|
||
return EGPIO_FAIL;
|
||
}
|
||
if(set_driver_level >= 4)
|
||
{
|
||
return EGPIO_FAIL;
|
||
}
|
||
tmp_buf = (char *)p_handler;
|
||
group_count_max = *(int *)tmp_buf;
|
||
tmp_sys_gpio_data = (system_gpio_set_t *)(tmp_buf + 16);
|
||
|
||
if(group_count_max == 0)
|
||
{
|
||
return EGPIO_FAIL;
|
||
}
|
||
else if(group_count_max == 1)
|
||
{
|
||
user_gpio_set = tmp_sys_gpio_data;
|
||
}
|
||
else if(gpio_name)
|
||
{
|
||
for(i=0; i<group_count_max; i++)
|
||
{
|
||
if(strcmp(gpio_name, tmp_sys_gpio_data->gpio_name))
|
||
{
|
||
tmp_sys_gpio_data ++;
|
||
continue;
|
||
}
|
||
user_gpio_set = tmp_sys_gpio_data;
|
||
break;
|
||
}
|
||
}
|
||
if(!user_gpio_set)
|
||
{
|
||
return EGPIO_FAIL;
|
||
}
|
||
|
||
port = user_gpio_set->port;
|
||
port_num = user_gpio_set->port_num;
|
||
port_num_dlevel = port_num >> 4;
|
||
|
||
if(port >= 12)
|
||
cpus_flag = 1;
|
||
if(!cpus_flag)
|
||
tmp_group_dlevel_addr = PIO_REG_DLEVEL(port, port_num_dlevel);
|
||
else
|
||
tmp_group_dlevel_addr = R_PIO_REG_DLEVEL(port,port_num_dlevel);
|
||
|
||
reg_val = GPIO_REG_READ(tmp_group_dlevel_addr);
|
||
reg_val &= ~(0x03 << (((port_num - (port_num_dlevel<<4))<<1)));
|
||
reg_val |= (set_driver_level << (((port_num - (port_num_dlevel<<4))<<1)));
|
||
GPIO_REG_WRITE(tmp_group_dlevel_addr, reg_val);
|
||
|
||
return EGPIO_SUCCESS;
|
||
}
|
||
#else
|
||
__s32 gpio_set_one_pin_driver_level(u32 p_handler, __u32 set_driver_level, const char *gpio_name)
|
||
{
|
||
char *tmp_buf; //ת<><D7AA><EFBFBD><EFBFBD>char<61><72><EFBFBD><EFBFBD>
|
||
__u32 group_count_max; //<2F><><EFBFBD><EFBFBD>GPIO<49><4F><EFBFBD><EFBFBD>
|
||
system_gpio_set_t *user_gpio_set = NULL, *tmp_sys_gpio_data;
|
||
volatile __u32 *tmp_group_dlevel_addr = NULL;
|
||
__u32 port, port_num, port_num_dlevel;
|
||
__u32 i, reg_val;
|
||
//<2F><><EFBFBD>鴫<EFBFBD><E9B4AB><EFBFBD>ľ<EFBFBD><C4BE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ч<EFBFBD><D0A7>
|
||
if(!p_handler)
|
||
{
|
||
return EGPIO_FAIL;
|
||
}
|
||
if(set_driver_level >= 4)
|
||
{
|
||
return EGPIO_FAIL;
|
||
}
|
||
tmp_buf = (char *)p_handler;
|
||
group_count_max = *(int *)tmp_buf;
|
||
tmp_sys_gpio_data = (system_gpio_set_t *)(tmp_buf + 16);
|
||
|
||
if(group_count_max == 0)
|
||
{
|
||
return EGPIO_FAIL;
|
||
}
|
||
else if(group_count_max == 1)
|
||
{
|
||
user_gpio_set = tmp_sys_gpio_data;
|
||
}
|
||
else if(gpio_name)
|
||
{
|
||
for(i=0; i<group_count_max; i++)
|
||
{
|
||
if(strcmp(gpio_name, tmp_sys_gpio_data->gpio_name))
|
||
{
|
||
tmp_sys_gpio_data ++;
|
||
continue;
|
||
}
|
||
user_gpio_set = tmp_sys_gpio_data;
|
||
break;
|
||
}
|
||
}
|
||
if(!user_gpio_set)
|
||
{
|
||
return EGPIO_FAIL;
|
||
}
|
||
|
||
port = user_gpio_set->port;
|
||
port_num = user_gpio_set->port_num;
|
||
port_num_dlevel = port_num >> 4;
|
||
|
||
tmp_group_dlevel_addr = PIO_REG_DLEVEL(port, port_num_dlevel);
|
||
reg_val = GPIO_REG_READ(tmp_group_dlevel_addr);
|
||
reg_val &= ~(0x03 << (((port_num - (port_num_dlevel<<4))<<1)));
|
||
reg_val |= (set_driver_level << (((port_num - (port_num_dlevel<<4))<<1)));
|
||
GPIO_REG_WRITE(tmp_group_dlevel_addr, reg_val);
|
||
|
||
return EGPIO_SUCCESS;
|
||
}
|
||
#endif
|
||
/*
|
||
**********************************************************************************************************************
|
||
* CSP_GPIO_Read_One_PIN_Value
|
||
*
|
||
* Description:
|
||
* <20><>ȡ<EFBFBD>û<EFBFBD><C3BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>GPIO<49>е<EFBFBD>ijһ<C4B3><D2BB>IO<49>ڵĶ˿ڵĵ<DAB5>ƽ
|
||
* Arguments :
|
||
* p_handler : handler
|
||
* gpio_name : Ҫ<><D2AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD>GPIO<49><4F><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||
* Returns :
|
||
*
|
||
* Notes :
|
||
*
|
||
**********************************************************************************************************************
|
||
*/
|
||
#ifdef SUNXI_R_PIO_BASE
|
||
__s32 gpio_read_one_pin_value(u32 p_handler, const char *gpio_name)
|
||
{
|
||
char *tmp_buf; //ת<><D7AA><EFBFBD><EFBFBD>char<61><72><EFBFBD><EFBFBD>
|
||
__u32 group_count_max; //<2F><><EFBFBD><EFBFBD>GPIO<49><4F><EFBFBD><EFBFBD>
|
||
system_gpio_set_t *user_gpio_set = NULL, *tmp_sys_gpio_data;
|
||
__u32 port, port_num, port_num_func, func_val;
|
||
__u32 i, reg_val;
|
||
int cpus_flag = 0;
|
||
//<2F><><EFBFBD>鴫<EFBFBD><E9B4AB><EFBFBD>ľ<EFBFBD><C4BE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ч<EFBFBD><D0A7>
|
||
if(!p_handler)
|
||
{
|
||
return EGPIO_FAIL;
|
||
}
|
||
tmp_buf = (char *)p_handler;
|
||
group_count_max = *(int *)tmp_buf;
|
||
tmp_sys_gpio_data = (system_gpio_set_t *)(tmp_buf + 16);
|
||
|
||
if(group_count_max == 0)
|
||
{
|
||
return EGPIO_FAIL;
|
||
}
|
||
else if(group_count_max == 1)
|
||
{
|
||
user_gpio_set = tmp_sys_gpio_data;
|
||
}
|
||
else if(gpio_name)
|
||
{
|
||
for(i=0; i<group_count_max; i++)
|
||
{
|
||
if(strcmp(gpio_name, tmp_sys_gpio_data->gpio_name))
|
||
{
|
||
tmp_sys_gpio_data ++;
|
||
continue;
|
||
}
|
||
user_gpio_set = tmp_sys_gpio_data;
|
||
break;
|
||
}
|
||
}
|
||
if(!user_gpio_set)
|
||
{
|
||
return EGPIO_FAIL;
|
||
}
|
||
|
||
port = user_gpio_set->port;
|
||
port_num = user_gpio_set->port_num;
|
||
port_num_func = port_num >> 3;
|
||
|
||
if(port >= 12)
|
||
cpus_flag = 1;
|
||
if(!cpus_flag)
|
||
{
|
||
reg_val = PIO_REG_CFG_VALUE(port, port_num_func);
|
||
}
|
||
else
|
||
{
|
||
reg_val = R_PIO_REG_CFG_VALUE(port, port_num_func);
|
||
}
|
||
|
||
func_val = (reg_val >> ((port_num - (port_num_func<<3))<<2)) & 0x07;
|
||
if(func_val == 0)
|
||
{
|
||
if(!cpus_flag)
|
||
{
|
||
reg_val = (PIO_REG_DATA_VALUE(port) >> port_num) & 0x01;
|
||
}
|
||
else
|
||
{
|
||
reg_val = (R_PIO_REG_DATA_VALUE(port) >> port_num) & 0x01;
|
||
}
|
||
|
||
return reg_val;
|
||
}
|
||
|
||
return EGPIO_FAIL;
|
||
}
|
||
#else
|
||
__s32 gpio_read_one_pin_value(u32 p_handler, const char *gpio_name)
|
||
{
|
||
char *tmp_buf; //ת<><D7AA><EFBFBD><EFBFBD>char<61><72><EFBFBD><EFBFBD>
|
||
__u32 group_count_max; //<2F><><EFBFBD><EFBFBD>GPIO<49><4F><EFBFBD><EFBFBD>
|
||
system_gpio_set_t *user_gpio_set = NULL, *tmp_sys_gpio_data;
|
||
__u32 port, port_num, port_num_func, func_val;
|
||
__u32 i, reg_val;
|
||
//<2F><><EFBFBD>鴫<EFBFBD><E9B4AB><EFBFBD>ľ<EFBFBD><C4BE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ч<EFBFBD><D0A7>
|
||
if(!p_handler)
|
||
{
|
||
return EGPIO_FAIL;
|
||
}
|
||
tmp_buf = (char *)p_handler;
|
||
group_count_max = *(int *)tmp_buf;
|
||
tmp_sys_gpio_data = (system_gpio_set_t *)(tmp_buf + 16);
|
||
|
||
if(group_count_max == 0)
|
||
{
|
||
return EGPIO_FAIL;
|
||
}
|
||
else if(group_count_max == 1)
|
||
{
|
||
user_gpio_set = tmp_sys_gpio_data;
|
||
}
|
||
else if(gpio_name)
|
||
{
|
||
for(i=0; i<group_count_max; i++)
|
||
{
|
||
if(strcmp(gpio_name, tmp_sys_gpio_data->gpio_name))
|
||
{
|
||
tmp_sys_gpio_data ++;
|
||
continue;
|
||
}
|
||
user_gpio_set = tmp_sys_gpio_data;
|
||
break;
|
||
}
|
||
}
|
||
if(!user_gpio_set)
|
||
{
|
||
return EGPIO_FAIL;
|
||
}
|
||
|
||
port = user_gpio_set->port;
|
||
port_num = user_gpio_set->port_num;
|
||
port_num_func = port_num >> 3;
|
||
|
||
reg_val = PIO_REG_CFG_VALUE(port, port_num_func);
|
||
|
||
func_val = (reg_val >> ((port_num - (port_num_func<<3))<<2)) & 0x07;
|
||
if(func_val == 0)
|
||
{
|
||
reg_val = (PIO_REG_DATA_VALUE(port) >> port_num) & 0x01;
|
||
return reg_val;
|
||
}
|
||
|
||
return EGPIO_FAIL;
|
||
}
|
||
#endif
|
||
/*
|
||
**********************************************************************************************************************
|
||
* CSP_GPIO_Write_One_PIN_Value
|
||
*
|
||
* Description:
|
||
* <20><EFBFBD><DEB8>û<EFBFBD><C3BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>GPIO<49>е<EFBFBD>ijһ<C4B3><D2BB>IO<49>ڵĶ˿ڵĵ<DAB5>ƽ
|
||
* Arguments :
|
||
* p_handler : handler
|
||
* value_to_gpio: Ҫ<><D2AA><EFBFBD>õĵ<C3B5>ƽ<EFBFBD>ĵ<EFBFBD>ѹ
|
||
* gpio_name : Ҫ<><D2AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD>GPIO<49><4F><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||
* Returns :
|
||
*
|
||
* Notes :
|
||
*
|
||
**********************************************************************************************************************
|
||
*/
|
||
#ifdef SUNXI_R_PIO_BASE
|
||
__s32 gpio_write_one_pin_value(u32 p_handler, __u32 value_to_gpio, const char *gpio_name)
|
||
{
|
||
char *tmp_buf; //ת<><D7AA><EFBFBD><EFBFBD>char<61><72><EFBFBD><EFBFBD>
|
||
__u32 group_count_max; //<2F><><EFBFBD><EFBFBD>GPIO<49><4F><EFBFBD><EFBFBD>
|
||
system_gpio_set_t *user_gpio_set = NULL, *tmp_sys_gpio_data;
|
||
volatile __u32 *tmp_group_data_addr = NULL;
|
||
__u32 port, port_num, port_num_func, func_val;
|
||
__u32 i, reg_val;
|
||
int cpus_flag = 0;
|
||
//<2F><><EFBFBD>鴫<EFBFBD><E9B4AB><EFBFBD>ľ<EFBFBD><C4BE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ч<EFBFBD><D0A7>
|
||
if(!p_handler)
|
||
{
|
||
return EGPIO_FAIL;
|
||
}
|
||
if(value_to_gpio >= 2)
|
||
{
|
||
return EGPIO_FAIL;
|
||
}
|
||
tmp_buf = (char *)p_handler;
|
||
group_count_max = *(int *)tmp_buf;
|
||
tmp_sys_gpio_data = (system_gpio_set_t *)(tmp_buf + 16);
|
||
|
||
if(group_count_max == 0)
|
||
{
|
||
return EGPIO_FAIL;
|
||
}
|
||
else if(group_count_max == 1)
|
||
{
|
||
user_gpio_set = tmp_sys_gpio_data;
|
||
}
|
||
else if(gpio_name)
|
||
{
|
||
for(i=0; i<group_count_max; i++)
|
||
{
|
||
if(strcmp(gpio_name, tmp_sys_gpio_data->gpio_name))
|
||
{
|
||
tmp_sys_gpio_data ++;
|
||
continue;
|
||
}
|
||
user_gpio_set = tmp_sys_gpio_data;
|
||
break;
|
||
}
|
||
}
|
||
if(!user_gpio_set)
|
||
{
|
||
return EGPIO_FAIL;
|
||
}
|
||
|
||
port = user_gpio_set->port;
|
||
port_num = user_gpio_set->port_num;
|
||
port_num_func = port_num >> 3;
|
||
if(port == 0xffff)
|
||
{
|
||
gpio_set_axpgpio_value(0, port_num, value_to_gpio);
|
||
return EGPIO_SUCCESS;
|
||
}
|
||
else
|
||
{
|
||
if(port >= 12 )
|
||
cpus_flag = 1;
|
||
if(!cpus_flag)
|
||
reg_val = PIO_REG_CFG_VALUE(port, port_num_func);
|
||
else
|
||
reg_val = R_PIO_REG_CFG_VALUE(port,port_num_func);
|
||
func_val = (reg_val >> ((port_num - (port_num_func<<3))<<2)) & 0x07;
|
||
if(func_val == 1)
|
||
{
|
||
if(!cpus_flag)
|
||
tmp_group_data_addr = PIO_REG_DATA(port);
|
||
else
|
||
tmp_group_data_addr = R_PIO_REG_DATA(port);
|
||
|
||
reg_val = GPIO_REG_READ(tmp_group_data_addr);
|
||
reg_val &= ~(1 << port_num);
|
||
reg_val |= (value_to_gpio << port_num);
|
||
GPIO_REG_WRITE(tmp_group_data_addr, reg_val);
|
||
|
||
return EGPIO_SUCCESS;
|
||
}
|
||
}
|
||
|
||
return EGPIO_FAIL;
|
||
}
|
||
#else
|
||
__s32 gpio_write_one_pin_value(u32 p_handler, __u32 value_to_gpio, const char *gpio_name)
|
||
{
|
||
char *tmp_buf; //ת<><D7AA><EFBFBD><EFBFBD>char<61><72><EFBFBD><EFBFBD>
|
||
__u32 group_count_max; //<2F><><EFBFBD><EFBFBD>GPIO<49><4F><EFBFBD><EFBFBD>
|
||
system_gpio_set_t *user_gpio_set = NULL, *tmp_sys_gpio_data;
|
||
volatile __u32 *tmp_group_data_addr = NULL;
|
||
__u32 port, port_num, port_num_func, func_val;
|
||
__u32 i, reg_val;
|
||
//<2F><><EFBFBD>鴫<EFBFBD><E9B4AB><EFBFBD>ľ<EFBFBD><C4BE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ч<EFBFBD><D0A7>
|
||
if(!p_handler)
|
||
{
|
||
return EGPIO_FAIL;
|
||
}
|
||
if(value_to_gpio >= 2)
|
||
{
|
||
return EGPIO_FAIL;
|
||
}
|
||
tmp_buf = (char *)p_handler;
|
||
group_count_max = *(int *)tmp_buf;
|
||
tmp_sys_gpio_data = (system_gpio_set_t *)(tmp_buf + 16);
|
||
|
||
if(group_count_max == 0)
|
||
{
|
||
return EGPIO_FAIL;
|
||
}
|
||
else if(group_count_max == 1)
|
||
{
|
||
user_gpio_set = tmp_sys_gpio_data;
|
||
}
|
||
else if(gpio_name)
|
||
{
|
||
for(i=0; i<group_count_max; i++)
|
||
{
|
||
if(strcmp(gpio_name, tmp_sys_gpio_data->gpio_name))
|
||
{
|
||
tmp_sys_gpio_data ++;
|
||
continue;
|
||
}
|
||
user_gpio_set = tmp_sys_gpio_data;
|
||
break;
|
||
}
|
||
}
|
||
if(!user_gpio_set)
|
||
{
|
||
return EGPIO_FAIL;
|
||
}
|
||
|
||
port = user_gpio_set->port;
|
||
port_num = user_gpio_set->port_num;
|
||
port_num_func = port_num >> 3;
|
||
|
||
reg_val = PIO_REG_CFG_VALUE(port, port_num_func);
|
||
func_val = (reg_val >> ((port_num - (port_num_func<<3))<<2)) & 0x07;
|
||
if(func_val == 1)
|
||
{
|
||
tmp_group_data_addr = PIO_REG_DATA(port);
|
||
reg_val = GPIO_REG_READ(tmp_group_data_addr);
|
||
reg_val &= ~(1 << port_num);
|
||
reg_val |= (value_to_gpio << port_num);
|
||
GPIO_REG_WRITE(tmp_group_data_addr, reg_val);
|
||
|
||
return EGPIO_SUCCESS;
|
||
}
|
||
|
||
return EGPIO_FAIL;
|
||
}
|
||
#endif
|
||
/*
|
||
************************************************************************************************************
|
||
*
|
||
* function
|
||
*
|
||
* name :
|
||
*
|
||
* parmeters :
|
||
*
|
||
* return :
|
||
*
|
||
* note :
|
||
*
|
||
*
|
||
************************************************************************************************************
|
||
*/
|
||
void upper(char *str)
|
||
{
|
||
int i=0;
|
||
char c;
|
||
|
||
do
|
||
{
|
||
c=str[i];
|
||
if(c=='\0')
|
||
{
|
||
return;
|
||
}
|
||
if((c>='a') && (c<='z'))
|
||
{
|
||
str[i]-=('a'-'A');
|
||
}
|
||
i++;
|
||
}
|
||
while(1);
|
||
}
|
||
/*
|
||
************************************************************************************************************
|
||
*
|
||
* function
|
||
*
|
||
* name :
|
||
*
|
||
* parmeters :
|
||
*
|
||
* return :
|
||
*
|
||
* note :
|
||
*
|
||
*
|
||
************************************************************************************************************
|
||
*/
|
||
void lower(char *str)
|
||
{
|
||
int i=0;
|
||
char c;
|
||
|
||
do
|
||
{
|
||
c=str[i];
|
||
if(c=='\0')
|
||
{
|
||
return;
|
||
}
|
||
if((c>='A') && (c<='Z'))
|
||
{
|
||
str[i]+=('a'-'A');
|
||
}
|
||
i++;
|
||
}
|
||
while(1);
|
||
}
|