Merge "[Feature][ZXW-301]Optimize CPU usage in debug mode"
diff --git a/ap/app/zte_comm/at_ctl/src/atctrl/at_ctl.c b/ap/app/zte_comm/at_ctl/src/atctrl/at_ctl.c
index 644e497..8a23c3a 100755
--- a/ap/app/zte_comm/at_ctl/src/atctrl/at_ctl.c
+++ b/ap/app/zte_comm/at_ctl/src/atctrl/at_ctl.c
@@ -796,7 +796,9 @@
/* Æô¶¯ÏûÏ¢¶¨Ê±²éѯ*/
at_timeout_start_perio_query();
}
- sc_cfg_get("customIndCmdList", PsmIndAtCmdPrefix, sizeof(PsmIndAtCmdPrefix));
+ //xf.li@20240603 modify for T106BUG-639 start
+ //sc_cfg_get("customIndCmdList", PsmIndAtCmdPrefix, sizeof(PsmIndAtCmdPrefix));
+ //xf.li@20240603 modify for T106BUG-639 end
while(g_powerOnType != POWER_ON_LOCALUPDATE)
{
iRet = 0;
diff --git a/cap/zx297520v3/src/lynq/framework/lynq-ril-service/src/ril.cpp b/cap/zx297520v3/src/lynq/framework/lynq-ril-service/src/ril.cpp
index 964989e..26f34a7 100755
--- a/cap/zx297520v3/src/lynq/framework/lynq-ril-service/src/ril.cpp
+++ b/cap/zx297520v3/src/lynq/framework/lynq-ril-service/src/ril.cpp
@@ -2913,12 +2913,19 @@
p.writeInt32(p_cur->WCDMA_SignalStrength.rscp);
p.writeInt32(p_cur->WCDMA_SignalStrength.ecno);
#ifdef TELEMATIC_5G_SUPPORT
- p.writeInt32(p_cur->NR_SignalStrength.ssRsrp);
- p.writeInt32(p_cur->NR_SignalStrength.ssRsrq);
- p.writeInt32(p_cur->NR_SignalStrength.ssSinr);
- p.writeInt32(p_cur->NR_SignalStrength.csiRsrp);
- p.writeInt32(p_cur->NR_SignalStrength.csiRsrq);
- p.writeInt32(p_cur->NR_SignalStrength.csiSinr);
+ if(responselen >= sizeof (RIL_SignalStrength_v14))
+ {
+ p.writeInt32(p_cur->NR_SignalStrength.ssRsrp);
+ p.writeInt32(p_cur->NR_SignalStrength.ssRsrq);
+ p.writeInt32(p_cur->NR_SignalStrength.ssSinr);
+ p.writeInt32(p_cur->NR_SignalStrength.csiRsrp);
+ p.writeInt32(p_cur->NR_SignalStrength.csiRsrq);
+ p.writeInt32(p_cur->NR_SignalStrength.csiSinr);
+ }
+ else
+ {
+ memset(&(p_cur->NR_SignalStrength), 0, sizeof(p_cur->NR_SignalStrength));
+ }
#endif
startResponse;
diff --git a/cap/zx297520v3/src/lynq/lib/liblynq-network/lynq_network.cpp b/cap/zx297520v3/src/lynq/lib/liblynq-network/lynq_network.cpp
index e1fdb18..1fd2780 100755
--- a/cap/zx297520v3/src/lynq/lib/liblynq-network/lynq_network.cpp
+++ b/cap/zx297520v3/src/lynq/lib/liblynq-network/lynq_network.cpp
@@ -18,6 +18,7 @@
#define LYNQ_RESP_STRING_MAX_NUM 128
#define LYNQ_TYPE_BUF 10
+#define LYNQ_URC_MSG_HEAD_ELEMENT_NUM 3
#define USER_LOG_TAG "LYNQ_NETWORK"
/*in CR AUTO00210807 MTK confirm set network selection mode max time is 14min 30s, first set 5 min 10s*/
@@ -1478,6 +1479,54 @@
return RESULT_OK;
}
+void convert_rscp(int relative_value, int* abs_value)
+{
+ if (0 == relative_value) {
+ (*abs_value) = 120;
+ }
+ else if (0 < relative_value && relative_value <= 96) {
+ (*abs_value) = 121 - relative_value;
+ }
+ else
+ {
+ (*abs_value) = 0x7FFFFFFF;
+ }
+}
+
+void convert_ecno(int relative_value, int* opposite_value_10_times)
+{
+ if (0 == relative_value)
+ {
+ (*opposite_value_10_times) = 240 ;
+ }
+ else if (0 < relative_value && relative_value <= 49)
+ {
+ (*opposite_value_10_times) = 245 - relative_value*5;
+ }
+ else
+ {
+ (*opposite_value_10_times) = 0x7FFFFFFF;
+ }
+}
+
+int is_rssi_valid(int rssi)
+{
+ if(rssi < 99 && rssi >=0)
+ {
+ return true;
+ }
+ return false;
+}
+
+int is_nr_ss_rsrp_valid(int ss_rsrp)
+{
+ if(ss_rsrp > 0 && ss_rsrp < 255)
+ {
+ return true;
+ }
+ return false;
+}
+
int lynq_solicited_signal_strength(signalStrength_t *solSigStren)
{
if(g_module_init_flag != MODULE_RUNNING)
@@ -1497,13 +1546,15 @@
{
LYERRLOG("%s call lynq_send_common_request failure, ret is %d",__func__,ret);
return ret;
- }
-
- int sum = 0;
+ }
+
+
int none = 0;
+ int rscp;
+ int ecno;
p->readInt32(&solSigStren->rssi);
- if((solSigStren->rssi > 0)&&(solSigStren->rssi < 99))
+ if(is_rssi_valid(solSigStren->rssi))
{
solSigStren->gw_sig_valid = 1;
}else{
@@ -1526,7 +1577,7 @@
p->readInt32(&solSigStren->rssnr);
LYINFLOG("LTE_signalstrength:%d",solSigStren->lte_signalstrength);
- if((solSigStren->lte_signalstrength > 0)&&(solSigStren->lte_signalstrength< 99))
+ if(is_rssi_valid(solSigStren->lte_signalstrength))
{
solSigStren->lte_sig_valid = 1;
}else{
@@ -1541,26 +1592,32 @@
p->readInt32(&none);
p->readInt32(&solSigStren->wcdma_signalstrength);
p->readInt32(&none);
- p->readInt32(&solSigStren->rscp);
- p->readInt32(&solSigStren->ecno);
+ p->readInt32(&rscp);
+ p->readInt32(&ecno);
+
+
LYINFLOG("WCDMA_signalstrength:%d",solSigStren->wcdma_signalstrength);
- if((solSigStren->wcdma_signalstrength > 0)&&(solSigStren->wcdma_signalstrength < 99))
+ if(is_rssi_valid(solSigStren->wcdma_signalstrength))
{
solSigStren->wcdma_sig_valid = 1;
+ convert_rscp(rscp,&solSigStren->rscp);
+ convert_ecno(ecno,&solSigStren->ecno);
}else{
solSigStren->wcdma_sig_valid = 0;
}
/*bug fix*/
- p->readInt32(&solSigStren->ssRsrp);
- p->readInt32(&solSigStren->ssRsrq);
- p->readInt32(&solSigStren->ssSinr);
- p->readInt32(&solSigStren->csiRsrp);
- p->readInt32(&solSigStren->csiRsrq);
- p->readInt32(&solSigStren->csiSinr);
- if(solSigStren->ssRsrp > 0 && solSigStren->ssRsrp < 255)
+ p->readInt32(&solSigStren->ssRsrp);
+
+ if(is_nr_ss_rsrp_valid(solSigStren->ssRsrp))
{
solSigStren->nr_sig_valid = 1;
- }else{
+ p->readInt32(&solSigStren->ssRsrq);
+ p->readInt32(&solSigStren->ssSinr);
+ p->readInt32(&solSigStren->csiRsrp);
+ p->readInt32(&solSigStren->csiRsrq);
+ p->readInt32(&solSigStren->csiSinr);
+ }
+ else{
LYERRLOG("None of NR signal info");
solSigStren->nr_sig_valid = 0;
}
@@ -1716,7 +1773,7 @@
case RIL_UNSOL_SIGNAL_STRENGTH:
{
p->readInt32(&s_network_urc_solSigStren.rssi);
- if((s_network_urc_solSigStren.rssi<=31)&&(s_network_urc_solSigStren.rssi>=0))
+ if(is_rssi_valid(s_network_urc_solSigStren.rssi))
{
s_network_urc_solSigStren.gw_sig_valid = 1;
LYINFLOG("urc_GSM_signalstrength:%d",s_network_urc_solSigStren.rssi);
@@ -1734,7 +1791,7 @@
p->readInt32(&s_network_urc_solSigStren.rsrp);
p->readInt32(&s_network_urc_solSigStren.rsrq);
p->readInt32(&s_network_urc_solSigStren.rssnr);
- if((s_network_urc_solSigStren.lte_signalstrength<=31)&&(s_network_urc_solSigStren.lte_signalstrength>=0))
+ if(is_rssi_valid(s_network_urc_solSigStren.lte_signalstrength))
{
s_network_urc_solSigStren.lte_sig_valid = 1;
LYINFLOG("urc_LTE_signalstrength:%d",s_network_urc_solSigStren.lte_signalstrength);
@@ -1750,30 +1807,38 @@
p->readInt32(&none);//bitErrorRate
p->readInt32(&s_network_urc_solSigStren.rscp);
p->readInt32(&s_network_urc_solSigStren.ecno);
- if((s_network_urc_solSigStren.wcdma_signalstrength<=31)&&(s_network_urc_solSigStren.wcdma_signalstrength>=0))
+ if(is_rssi_valid(s_network_urc_solSigStren.wcdma_signalstrength))
{
s_network_urc_solSigStren.wcdma_sig_valid = 1;
LYINFLOG("urc_WCDMA_signalstrength:%d",s_network_urc_solSigStren.wcdma_signalstrength);
}else{
s_network_urc_solSigStren.wcdma_sig_valid = 0;
}
- p->readInt32(&s_network_urc_solSigStren.ssRsrp);
- p->readInt32(&s_network_urc_solSigStren.ssRsrq);
- p->readInt32(&s_network_urc_solSigStren.ssSinr);
- p->readInt32(&s_network_urc_solSigStren.csiRsrp);
- p->readInt32(&s_network_urc_solSigStren.csiRsrq);
- p->readInt32(&s_network_urc_solSigStren.csiSinr);
- NR_sum = (s_network_urc_solSigStren.ssRsrp) + (s_network_urc_solSigStren.ssRsrq) + (s_network_urc_solSigStren.ssSinr) + (s_network_urc_solSigStren.csiRsrp)+\
- (s_network_urc_solSigStren.csiRsrq) + (s_network_urc_solSigStren.csiSinr);
- if(NR_sum != 0)
+
+ if(size >= sizeof(RIL_SignalStrength_v14)+sizeof(int)*LYNQ_URC_MSG_HEAD_ELEMENT_NUM)
{
- s_network_urc_solSigStren.nr_sig_valid = 1;
- LYINFLOG("[NR signal]ssRsrp is %d , ssRsrq is %d , ssSinr is %d , csiRsrp is %d , csiRsrq is %d , csiSinr is %d",\
- s_network_urc_solSigStren.ssRsrp,s_network_urc_solSigStren.ssRsrq,s_network_urc_solSigStren.ssSinr, \
- s_network_urc_solSigStren.csiRsrp,s_network_urc_solSigStren.csiRsrq,s_network_urc_solSigStren.csiSinr);
- }else{
- s_network_urc_solSigStren.nr_sig_valid = 0;
- }
+ p->readInt32(&s_network_urc_solSigStren.ssRsrp);
+ if(is_nr_ss_rsrp_valid(s_network_urc_solSigStren.ssRsrp))
+ {
+ s_network_urc_solSigStren.nr_sig_valid = 1;
+ p->readInt32(&s_network_urc_solSigStren.ssRsrq);
+ p->readInt32(&s_network_urc_solSigStren.ssSinr);
+ p->readInt32(&s_network_urc_solSigStren.csiRsrp);
+ p->readInt32(&s_network_urc_solSigStren.csiRsrq);
+ p->readInt32(&s_network_urc_solSigStren.csiSinr);
+ LYINFLOG("[NR signal]ssRsrp is %d , ssRsrq is %d , ssSinr is %d , csiRsrp is %d , csiRsrq is %d , csiSinr is %d",\
+ s_network_urc_solSigStren.ssRsrp,s_network_urc_solSigStren.ssRsrq,s_network_urc_solSigStren.ssSinr, \
+ s_network_urc_solSigStren.csiRsrp,s_network_urc_solSigStren.csiRsrq,s_network_urc_solSigStren.csiSinr);
+ }
+ else
+ {
+ s_network_urc_solSigStren.nr_sig_valid = 0;
+ }
+ }
+ else
+ {
+ s_network_urc_solSigStren.nr_sig_valid = 0;
+ }
send_urc_signal_changes();
break;
}
diff --git a/cap/zx297520v3/src/lynq/lib/liblynq-qser-data/lynq-qser-data.cpp b/cap/zx297520v3/src/lynq/lib/liblynq-qser-data/lynq-qser-data.cpp
index 010ed7c..786428f 100755
--- a/cap/zx297520v3/src/lynq/lib/liblynq-qser-data/lynq-qser-data.cpp
+++ b/cap/zx297520v3/src/lynq/lib/liblynq-qser-data/lynq-qser-data.cpp
@@ -1473,6 +1473,7 @@
info->ip_family = ip_family;
if ((strncmp(data_call_info.type,"IPV4", strlen("IPV4") + 1) == 0) || (strncmp(data_call_info.type,"IP", strlen("IP") + 1) == 0))
{
+ info->ip_family = QSER_DATA_CALL_TYPE_IPV4;
strcpy(info->v4.name,data_call_info.ifname);
datacall_ipv4_status_judge(data_call_info.active,info);
LYINFLOG("[IPV4]addresses:%s,gateways:%s,dnses:%s",data_call_info.addresses,data_call_info.gateways,data_call_info.dnses);
@@ -1480,6 +1481,7 @@
}
else if (strncmp(data_call_info.type,"IPV6", strlen("IPV6") + 1) == 0)
{
+ info->ip_family = QSER_DATA_CALL_TYPE_IPV6;
strcpy(info->v6.name,data_call_info.ifname);
datacall_ipv6_status_judge(data_call_info.active,info);
LYINFLOG("[IPV6]addresses:%s,gateways:%s,dnses:%s",data_call_info.addresses,data_call_info.gateways,data_call_info.dnses);
@@ -1487,6 +1489,7 @@
}
else if (strncmp(data_call_info.type,"IPV4V6", strlen("IPV4V6") + 1) == 0)
{
+ info->ip_family = QSER_DATA_CALL_TYPE_IPV4V6;
strcpy(info->v4.name,data_call_info.ifname);
datacall_ipv4_status_judge(data_call_info.active,info);
LYINFLOG("[IPV4V6]addresses:%s,gateways:%s,dnses:%s",data_call_info.addresses,data_call_info.gateways,data_call_info.dnses);
diff --git a/cap/zx297520v3/src/lynq/lib/liblynq-qser-network/lynq_qser_network.cpp b/cap/zx297520v3/src/lynq/lib/liblynq-qser-network/lynq_qser_network.cpp
index 86f3ed6..e1d2ab4 100755
--- a/cap/zx297520v3/src/lynq/lib/liblynq-qser-network/lynq_qser_network.cpp
+++ b/cap/zx297520v3/src/lynq/lib/liblynq-qser-network/lynq_qser_network.cpp
@@ -134,15 +134,15 @@
{
QSER_NW_SINGNAL_EVENT_IND_T msg_buf;
msg_buf.gsm_sig_info_valid = signalstrength.gw_sig_valid;
- msg_buf.gsm_sig_info.rssi = signalstrength.rssi;
+ msg_buf.gsm_sig_info.rssi = (signalstrength.rssi<<1)-110;
msg_buf.wcdma_sig_info_valid = signalstrength.wcdma_sig_valid;
- msg_buf.wcdma_sig_info.rssi = signalstrength.rscp;
- msg_buf.wcdma_sig_info.ecio = signalstrength.ecno;
+ msg_buf.wcdma_sig_info.rssi = (signalstrength.wcdma_signalstrength<<1)-113;
+ msg_buf.wcdma_sig_info.ecio = signalstrength.ecno/5;
msg_buf.tdscdma_sig_info_valid = 0;
msg_buf.lte_sig_info_valid = signalstrength.lte_sig_valid;
- msg_buf.lte_sig_info.rssi = -125;
- msg_buf.lte_sig_info.rsrp = signalstrength.rsrp;
- msg_buf.lte_sig_info.rsrq = signalstrength.rsrq;
+ msg_buf.lte_sig_info.rssi = (signalstrength.lte_signalstrength<<1)-113;
+ msg_buf.lte_sig_info.rsrp = -signalstrength.rsrp;
+ msg_buf.lte_sig_info.rsrq = -signalstrength.rsrq;
msg_buf.lte_sig_info.snr = signalstrength.rssnr;
msg_buf.cdma_sig_info_valid = 0;
msg_buf.hdr_sig_info_valid = 0;
@@ -736,15 +736,15 @@
return RESULT_ERROR;
}
pt_info->gsm_sig_info_valid = lib_info.gw_sig_valid;
- pt_info->gsm_sig_info.rssi = lib_info.rssi-110;
+ pt_info->gsm_sig_info.rssi = (lib_info.rssi<<1)-110;
pt_info->wcdma_sig_info_valid = lib_info.wcdma_sig_valid;
- pt_info->wcdma_sig_info.rssi = lib_info.wcdma_signalstrength-110;
+ pt_info->wcdma_sig_info.rssi = (lib_info.wcdma_signalstrength<<1)-113;
pt_info->wcdma_sig_info.ecio = lib_info.ecno/5;
pt_info->tdscdma_sig_info_valid = 0;
pt_info->lte_sig_info_valid = lib_info.lte_sig_valid;
- pt_info->lte_sig_info.rssi = lib_info.lte_signalstrength-110;
- pt_info->lte_sig_info.rsrp = lib_info.rsrp*(-1);
- pt_info->lte_sig_info.rsrq = lib_info.rsrq*(-1);
+ pt_info->lte_sig_info.rssi = (lib_info.lte_signalstrength<<1)-113;
+ pt_info->lte_sig_info.rsrp = -lib_info.rsrp;
+ pt_info->lte_sig_info.rsrq = -lib_info.rsrq;
pt_info->lte_sig_info.snr = lib_info.rssnr;
pt_info->cdma_sig_info_valid = 0;
pt_info->hdr_sig_info_valid = 0;
diff --git a/cap/zx297520v3/zxic_code/zxic_source/linux-5.10/arch/arm/boot/dts/zx297520v3-vehicle_dc_ref.dts b/cap/zx297520v3/zxic_code/zxic_source/linux-5.10/arch/arm/boot/dts/zx297520v3-vehicle_dc_ref.dts
index 4f4e580..ca14eb2 100755
--- a/cap/zx297520v3/zxic_code/zxic_source/linux-5.10/arch/arm/boot/dts/zx297520v3-vehicle_dc_ref.dts
+++ b/cap/zx297520v3/zxic_code/zxic_source/linux-5.10/arch/arm/boot/dts/zx297520v3-vehicle_dc_ref.dts
@@ -204,6 +204,14 @@
linux,code = <KEY_WAKEUP>;
status = "disabled";//jb.qi change on 20231204
};
-
+//xf.li add for status init start
+&gpio_init {
+ status_127{
+ gpio_num = <127>;
+ gpio_dir = <1>;
+ gpio_dout = <1>;
+ };
+//xf.li add for status init end
+};
diff --git a/cap/zx297520v3/zxic_code/zxic_source/linux-5.10/arch/arm/boot/dts/zx297520v3.dtsi b/cap/zx297520v3/zxic_code/zxic_source/linux-5.10/arch/arm/boot/dts/zx297520v3.dtsi
index 006a945..9d2cb3c 100755
--- a/cap/zx297520v3/zxic_code/zxic_source/linux-5.10/arch/arm/boot/dts/zx297520v3.dtsi
+++ b/cap/zx297520v3/zxic_code/zxic_source/linux-5.10/arch/arm/boot/dts/zx297520v3.dtsi
@@ -905,7 +905,6 @@
status = "disabled";
};
-
};
firmware {
optee {
@@ -913,6 +912,11 @@
method = "icp";
};
};
+//xf.li add for status init start
+ gpio_init: gpio_init {
+ compatible = "lynq,gpio_init";
+ };
+//xf.li add for status init end
};
#include "zx297520v3-pinctrl.dtsi"
diff --git a/cap/zx297520v3/zxic_code/zxic_source/linux-5.10/drivers/Makefile b/cap/zx297520v3/zxic_code/zxic_source/linux-5.10/drivers/Makefile
index 5762280..f920c5e 100644
--- a/cap/zx297520v3/zxic_code/zxic_source/linux-5.10/drivers/Makefile
+++ b/cap/zx297520v3/zxic_code/zxic_source/linux-5.10/drivers/Makefile
@@ -22,7 +22,9 @@
obj-$(CONFIG_RAPIDIO) += rapidio/
obj-y += video/
obj-y += idle/
-
+#xf.li add for status init start
+obj-y += lynq_gpio_init/
+#xf.li add for status init end
# IPMI must come before ACPI in order to provide IPMI opregion support
obj-y += char/ipmi/
diff --git a/cap/zx297520v3/zxic_code/zxic_source/linux-5.10/drivers/lynq_gpio_init/Makefile b/cap/zx297520v3/zxic_code/zxic_source/linux-5.10/drivers/lynq_gpio_init/Makefile
new file mode 100644
index 0000000..0f7ff3d
--- /dev/null
+++ b/cap/zx297520v3/zxic_code/zxic_source/linux-5.10/drivers/lynq_gpio_init/Makefile
@@ -0,0 +1,2 @@
+
+obj-y += lynq_gpio_init.o
diff --git a/cap/zx297520v3/zxic_code/zxic_source/linux-5.10/drivers/lynq_gpio_init/lynq_gpio_init.c b/cap/zx297520v3/zxic_code/zxic_source/linux-5.10/drivers/lynq_gpio_init/lynq_gpio_init.c
new file mode 100755
index 0000000..5216ddb
--- /dev/null
+++ b/cap/zx297520v3/zxic_code/zxic_source/linux-5.10/drivers/lynq_gpio_init/lynq_gpio_init.c
@@ -0,0 +1,52 @@
+#include <linux/init.h>
+#include <linux/kernel.h>
+#include <linux/module.h>
+#include <linux/gpio.h>
+#include <linux/of.h>
+#include <linux/of_gpio.h>
+#include <linux/platform_device.h>
+
+#include "lynq_gpio_init.h"
+
+static int __init lynq_gpio_init(void)
+{
+ struct device_node *gpio_device_node = NULL;
+ struct device_node *gpio_next_node = NULL;
+ int ret = 0;
+ int node_num = 0;
+ int i;
+
+ printk("GPIO_INIT:init start");
+ //find the dts node
+ gpio_device_node = of_find_node_by_path("/gpio_init");
+ if(gpio_device_node == NULL)
+ {
+ printk("GPIO_INIT: get DTS property failed!\n");
+ return 0;
+ }
+ //get the number of gpio_init child node
+ node_num = of_get_child_count(gpio_device_node);
+//set each gpio
+ for(i = 0; i < node_num; i++)
+ {
+ gpio_next_node = of_get_next_child(gpio_device_node, gpio_next_node);
+ if(gpio_next_node)
+ {
+ printk("GPIO_INIT: exist this node");
+ }
+ else
+ {
+ printk("GPIO_INIT: no more node");
+ break;
+ }
+ ret = set_gpio(gpio_next_node, i);
+ }
+
+ printk("GPIO_INIT:END");
+ return 0;
+}
+device_initcall(lynq_gpio_init);
+MODULE_AUTHOR("Mobiletek");
+MODULE_DESCRIPTION("driver for init gpio");
+MODULE_LICENSE("GPL");
+
diff --git a/cap/zx297520v3/zxic_code/zxic_source/linux-5.10/drivers/lynq_gpio_init/lynq_gpio_init.h b/cap/zx297520v3/zxic_code/zxic_source/linux-5.10/drivers/lynq_gpio_init/lynq_gpio_init.h
new file mode 100755
index 0000000..6025e98
--- /dev/null
+++ b/cap/zx297520v3/zxic_code/zxic_source/linux-5.10/drivers/lynq_gpio_init/lynq_gpio_init.h
@@ -0,0 +1,136 @@
+#include <linux/init.h>
+#include <linux/kernel.h>
+#include <linux/module.h>
+#include <linux/gpio.h>
+#include <linux/of.h>
+#include <linux/of_gpio.h>
+#include <linux/kobject.h>
+#include <linux/platform_device.h>
+#include <linux/device.h>
+#include <linux/string.h>
+#include <linux/sysfs.h>
+#include <linux/stat.h>
+#include <linux/slab.h>
+#include <linux/delay.h>
+
+struct gpio_node{
+ unsigned gpio_num;
+ int gpio_dir;
+ int gpio_dout;
+ int pre_mdelay_time;
+ int post_mdelay_time;
+};
+
+int set_gpio(struct device_node *gpio_node, int num);
+
+int set_gpio(struct device_node *gpio_node, int num)
+{
+ int ret = 0;
+ unsigned int gpio_num, gpio_dir, gpio_dout, pre_mdelay_time, post_mdelay_time;
+
+ ret = of_property_read_u32(gpio_node, "pre_mdelay_time", &pre_mdelay_time);
+ if(ret == -EINVAL || ret == -ENODATA)
+ {
+ printk("no value or no node");
+ }
+ else if(ret < 0)
+ {
+ printk("GPIO_INIT:READ ERROR: %d", ret);
+ return ret;
+ }
+ else
+ {
+ mdelay(pre_mdelay_time);
+ }
+
+ //get the gpio num
+ ret = of_property_read_u32(gpio_node, "gpio_num", &gpio_num);
+ if(ret == -EINVAL || ret == -ENODATA)
+ {
+ printk("no value or no node");
+ return 0;
+ }
+ else if(ret < 0)
+ {
+ printk("GPIO_INIT:READ ERROR: %d", ret);
+ return ret;
+ }
+
+ printk("GPIO_INIT: the gpio_num is %u", gpio_num);
+ //end of get gpio num
+
+//set gpio dir
+ ret = of_property_read_u32(gpio_node, "gpio_dir", &gpio_dir);
+ if(ret == -EINVAL || ret == -ENODATA)
+ {
+ printk("no value or no node");
+ return ret;
+ }
+ else if(ret < 0)
+ {
+ printk("GPIO_INIT:READ ERROR: %d", ret);
+ return ret;
+ }
+ if(gpio_dir == 0)
+ {
+ printk("GPIO_INIT: gpio_dir is 0, input");
+ gpio_direction_input(gpio_num);
+ }
+ else if (gpio_dir == 1)
+ {
+ //set gpio dout
+ printk("GPIO_INIT: gpio_dir is 1, output");
+ ret = of_property_read_u32(gpio_node, "gpio_dout", &gpio_dout);
+ if(ret == -EINVAL || ret == -ENODATA)
+ {
+ printk("no value or no node");;
+ }
+ else if(ret < 0)
+ {
+ printk("GPIO_INIT:READ ERROR: %d", ret);
+ return ret;
+ }
+ else
+ {
+ printk("GPIO_INIT: the gpio_dout is %u", gpio_dout);
+ if(gpio_dout == 0 || gpio_dout == 1)
+ {
+ ret = gpio_direction_output(gpio_num, gpio_dout);
+ if(ret == 0)
+ {
+ printk("GPIO_INIT: modify successfully");
+ }
+ else
+ {
+ printk("GPIO_INIT: SET REEOR %d", ret);
+ return ret;
+ }
+ }
+ else
+ {
+ printk("GPIO_INIT: dout: %u out of the range 0-1\n", gpio_dout);
+ }
+ }
+ }
+ else
+ {
+ printk("GPIO_INIT: gpio_dir: %u out of the range 0-1\n", gpio_dir);
+ }
+
+ ret = of_property_read_u32(gpio_node, "post_mdelay_time", &post_mdelay_time);
+ if(ret == -EINVAL || ret == -ENODATA)
+ {
+ printk("no value or no node");
+ }
+ else if(ret < 0)
+ {
+ printk("GPIO_INIT:READ ERROR: %d", ret);
+ return ret;
+ }
+ else
+ {
+ mdelay(post_mdelay_time);
+ }
+
+ return ret;
+}