diff --git a/src/lynq/lib/liblynq-driver-control/MODULE_LICENSE_APACHE2 b/src/lynq/lib/liblynq-driver-control/MODULE_LICENSE_APACHE2
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/src/lynq/lib/liblynq-driver-control/MODULE_LICENSE_APACHE2
diff --git a/src/lynq/lib/liblynq-driver-control/Makefile b/src/lynq/lib/liblynq-driver-control/Makefile
new file mode 100644
index 0000000..7130bfd
--- /dev/null
+++ b/src/lynq/lib/liblynq-driver-control/Makefile
@@ -0,0 +1,63 @@
+PREFIX   = ../install
+CROSS    = arm-none-linux-
+ROOT     = $(PREFIX)/$(CROSS:%-=%)
+
+#For Yocto use
+
+RFX_TEST_CLIENT = false
+RFX_TEST_AOSP = false
+
+$(warning ########## libvendor_ril BB_TELEFWK_OPTION $(BB_TELEFWK_OPTION) ##########)
+
+		   
+
+SUBDIRS +=  liblynq-driver-control
+
+
+
+
+
+$(warning ########## lynq-rilcmd SUBDIRS  $(SUBDIRS) ##########)
+export SIM_COUNT?=1
+
+.PHONY: all build clean pack_rootfs
+
+all: build
+
+build: clean
+
+clean:
+	$(warning ########## clean ril ##########)
+	for i in $(SUBDIRS); do			\
+		(cd $$i && make clean);			\
+		if [ $$? != 0 ]; then		\
+			exit 1;					\
+		fi							\
+	done
+
+build:
+	$(warning ########## build ril ##########)
+	for i in $(SUBDIRS); do			\
+		(cd $$i && make);			\
+		if [ $$? != 0 ]; then		\
+			exit 1;					\
+		fi							\
+	done
+
+install:
+	$(warning ########## install ril ##########)
+	for i in $(SUBDIRS); do			\
+		(cd $$i && make install);			\
+		if [ $$? != 0 ]; then		\
+			exit 1;					\
+		fi							\
+	done
+
+pack_rootfs:
+	$(warning ########## pack_rootfs ril ##########)
+	for i in $(SUBDIRS); do			\
+		(cd $$i && make pack_rootfs);			\
+		if [ $$? != 0 ]; then		\
+			exit 1;					\
+		fi							\
+	done
diff --git a/src/lynq/lib/liblynq-driver-control/NOTICE b/src/lynq/lib/liblynq-driver-control/NOTICE
new file mode 100644
index 0000000..c5b1efa
--- /dev/null
+++ b/src/lynq/lib/liblynq-driver-control/NOTICE
@@ -0,0 +1,190 @@
+
+   Copyright (c) 2005-2008, The Android Open Source Project
+
+   Licensed under the Apache License, Version 2.0 (the "License");
+   you may not use this file except in compliance with the License.
+
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.
+
+
+                                 Apache License
+                           Version 2.0, January 2004
+                        http://www.apache.org/licenses/
+
+   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+   1. Definitions.
+
+      "License" shall mean the terms and conditions for use, reproduction,
+      and distribution as defined by Sections 1 through 9 of this document.
+
+      "Licensor" shall mean the copyright owner or entity authorized by
+      the copyright owner that is granting the License.
+
+      "Legal Entity" shall mean the union of the acting entity and all
+      other entities that control, are controlled by, or are under common
+      control with that entity. For the purposes of this definition,
+      "control" means (i) the power, direct or indirect, to cause the
+      direction or management of such entity, whether by contract or
+      otherwise, or (ii) ownership of fifty percent (50%) or more of the
+      outstanding shares, or (iii) beneficial ownership of such entity.
+
+      "You" (or "Your") shall mean an individual or Legal Entity
+      exercising permissions granted by this License.
+
+      "Source" form shall mean the preferred form for making modifications,
+      including but not limited to software source code, documentation
+      source, and configuration files.
+
+      "Object" form shall mean any form resulting from mechanical
+      transformation or translation of a Source form, including but
+      not limited to compiled object code, generated documentation,
+      and conversions to other media types.
+
+      "Work" shall mean the work of authorship, whether in Source or
+      Object form, made available under the License, as indicated by a
+      copyright notice that is included in or attached to the work
+      (an example is provided in the Appendix below).
+
+      "Derivative Works" shall mean any work, whether in Source or Object
+      form, that is based on (or derived from) the Work and for which the
+      editorial revisions, annotations, elaborations, or other modifications
+      represent, as a whole, an original work of authorship. For the purposes
+      of this License, Derivative Works shall not include works that remain
+      separable from, or merely link (or bind by name) to the interfaces of,
+      the Work and Derivative Works thereof.
+
+      "Contribution" shall mean any work of authorship, including
+      the original version of the Work and any modifications or additions
+      to that Work or Derivative Works thereof, that is intentionally
+      submitted to Licensor for inclusion in the Work by the copyright owner
+      or by an individual or Legal Entity authorized to submit on behalf of
+      the copyright owner. For the purposes of this definition, "submitted"
+      means any form of electronic, verbal, or written communication sent
+      to the Licensor or its representatives, including but not limited to
+      communication on electronic mailing lists, source code control systems,
+      and issue tracking systems that are managed by, or on behalf of, the
+      Licensor for the purpose of discussing and improving the Work, but
+      excluding communication that is conspicuously marked or otherwise
+      designated in writing by the copyright owner as "Not a Contribution."
+
+      "Contributor" shall mean Licensor and any individual or Legal Entity
+      on behalf of whom a Contribution has been received by Licensor and
+      subsequently incorporated within the Work.
+
+   2. Grant of Copyright License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      copyright license to reproduce, prepare Derivative Works of,
+      publicly display, publicly perform, sublicense, and distribute the
+      Work and such Derivative Works in Source or Object form.
+
+   3. Grant of Patent License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      (except as stated in this section) patent license to make, have made,
+      use, offer to sell, sell, import, and otherwise transfer the Work,
+      where such license applies only to those patent claims licensable
+      by such Contributor that are necessarily infringed by their
+      Contribution(s) alone or by combination of their Contribution(s)
+      with the Work to which such Contribution(s) was submitted. If You
+      institute patent litigation against any entity (including a
+      cross-claim or counterclaim in a lawsuit) alleging that the Work
+      or a Contribution incorporated within the Work constitutes direct
+      or contributory patent infringement, then any patent licenses
+      granted to You under this License for that Work shall terminate
+      as of the date such litigation is filed.
+
+   4. Redistribution. You may reproduce and distribute copies of the
+      Work or Derivative Works thereof in any medium, with or without
+      modifications, and in Source or Object form, provided that You
+      meet the following conditions:
+
+      (a) You must give any other recipients of the Work or
+          Derivative Works a copy of this License; and
+
+      (b) You must cause any modified files to carry prominent notices
+          stating that You changed the files; and
+
+      (c) You must retain, in the Source form of any Derivative Works
+          that You distribute, all copyright, patent, trademark, and
+          attribution notices from the Source form of the Work,
+          excluding those notices that do not pertain to any part of
+          the Derivative Works; and
+
+      (d) If the Work includes a "NOTICE" text file as part of its
+          distribution, then any Derivative Works that You distribute must
+          include a readable copy of the attribution notices contained
+          within such NOTICE file, excluding those notices that do not
+          pertain to any part of the Derivative Works, in at least one
+          of the following places: within a NOTICE text file distributed
+          as part of the Derivative Works; within the Source form or
+          documentation, if provided along with the Derivative Works; or,
+          within a display generated by the Derivative Works, if and
+          wherever such third-party notices normally appear. The contents
+          of the NOTICE file are for informational purposes only and
+          do not modify the License. You may add Your own attribution
+          notices within Derivative Works that You distribute, alongside
+          or as an addendum to the NOTICE text from the Work, provided
+          that such additional attribution notices cannot be construed
+          as modifying the License.
+
+      You may add Your own copyright statement to Your modifications and
+      may provide additional or different license terms and conditions
+      for use, reproduction, or distribution of Your modifications, or
+      for any such Derivative Works as a whole, provided Your use,
+      reproduction, and distribution of the Work otherwise complies with
+      the conditions stated in this License.
+
+   5. Submission of Contributions. Unless You explicitly state otherwise,
+      any Contribution intentionally submitted for inclusion in the Work
+      by You to the Licensor shall be under the terms and conditions of
+      this License, without any additional terms or conditions.
+      Notwithstanding the above, nothing herein shall supersede or modify
+      the terms of any separate license agreement you may have executed
+      with Licensor regarding such Contributions.
+
+   6. Trademarks. This License does not grant permission to use the trade
+      names, trademarks, service marks, or product names of the Licensor,
+      except as required for reasonable and customary use in describing the
+      origin of the Work and reproducing the content of the NOTICE file.
+
+   7. Disclaimer of Warranty. Unless required by applicable law or
+      agreed to in writing, Licensor provides the Work (and each
+      Contributor provides its Contributions) on an "AS IS" BASIS,
+      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+      implied, including, without limitation, any warranties or conditions
+      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+      PARTICULAR PURPOSE. You are solely responsible for determining the
+      appropriateness of using or redistributing the Work and assume any
+      risks associated with Your exercise of permissions under this License.
+
+   8. Limitation of Liability. In no event and under no legal theory,
+      whether in tort (including negligence), contract, or otherwise,
+      unless required by applicable law (such as deliberate and grossly
+      negligent acts) or agreed to in writing, shall any Contributor be
+      liable to You for damages, including any direct, indirect, special,
+      incidental, or consequential damages of any character arising as a
+      result of this License or out of the use or inability to use the
+      Work (including but not limited to damages for loss of goodwill,
+      work stoppage, computer failure or malfunction, or any and all
+      other commercial damages or losses), even if such Contributor
+      has been advised of the possibility of such damages.
+
+   9. Accepting Warranty or Additional Liability. While redistributing
+      the Work or Derivative Works thereof, You may choose to offer,
+      and charge a fee for, acceptance of support, warranty, indemnity,
+      or other liability obligations and/or rights consistent with this
+      License. However, in accepting such obligations, You may act only
+      on Your own behalf and on Your sole responsibility, not on behalf
+      of any other Contributor, and only if You agree to indemnify,
+      defend, and hold each Contributor harmless for any liability
+      incurred by, or claims asserted against, such Contributor by reason
+      of your accepting any such warranty or additional liability.
+
+   END OF TERMS AND CONDITIONS
+
diff --git a/src/lynq/lib/liblynq-driver-control/README b/src/lynq/lib/liblynq-driver-control/README
new file mode 100644
index 0000000..9a7e82f
--- /dev/null
+++ b/src/lynq/lib/liblynq-driver-control/README
@@ -0,0 +1,13 @@
+WHAT IT DOES?
+=============
+MTK ril proxy core library
+
+HOW IT WAS BUILT?
+==================
+This module is source code released.
+
+HOW TO USE IT?
+==============
+MTK ril proxy daemon will use this library to communicate with GSM and C2K RILD.
+
+All the source code of this folder were written by MediaTek co..
diff --git a/src/lynq/lib/liblynq-driver-control/include/adc/adc.h b/src/lynq/lib/liblynq-driver-control/include/adc/adc.h
new file mode 100644
index 0000000..a119803
--- /dev/null
+++ b/src/lynq/lib/liblynq-driver-control/include/adc/adc.h
@@ -0,0 +1,5 @@
+#ifndef __ADC_H__
+#define __ADC_H__
+int lynq_set_adc_channel(unsigned char channel_val);
+float lynq_get_adc_data(void);
+#endif //__ADC_H__
\ No newline at end of file
diff --git a/src/lynq/lib/liblynq-driver-control/include/i2c/i2c.h b/src/lynq/lib/liblynq-driver-control/include/i2c/i2c.h
new file mode 100644
index 0000000..881f343
--- /dev/null
+++ b/src/lynq/lib/liblynq-driver-control/include/i2c/i2c.h
@@ -0,0 +1,7 @@
+#ifndef __I2C_H__
+#define __I2C_H__
+
+int lynq_set_i2c_deplop(int set_bus_id,int set_address,int set_speedhz,unsigned int rx_length);
+int lynq_i2c_tx(int wr_len,char *wr_buf);
+int lynq_i2c_rx(int *rd_len, char *rd_buf);
+#endif
\ No newline at end of file
diff --git a/src/lynq/lib/liblynq-driver-control/include/liblynq-driver-control/libdriver.h b/src/lynq/lib/liblynq-driver-control/include/liblynq-driver-control/libdriver.h
new file mode 100644
index 0000000..2cc4804
--- /dev/null
+++ b/src/lynq/lib/liblynq-driver-control/include/liblynq-driver-control/libdriver.h
@@ -0,0 +1,12 @@
+#ifndef __LYNQ_DRIVER_CONTROL_H__
+#define __LYNQ_DRIVER_CONTROL_H__
+typedef int BOOL;
+typedef void (*triggerCallback)(const char*, int);
+void disconnect_key();
+void register_key_info();
+int trigger_loop();
+//BOOL ServiceIsReady(void);
+void registerTriggerCallback(triggerCallback callback);
+int lynq_set_gpio (char * mode,int gpio_numb,int param);
+void lynq_get_gpio (int gpio_numb,char *response);
+#endif  //__LOG_H__
diff --git a/src/lynq/lib/liblynq-driver-control/include/pwm/pwm.h b/src/lynq/lib/liblynq-driver-control/include/pwm/pwm.h
new file mode 100644
index 0000000..b86978f
--- /dev/null
+++ b/src/lynq/lib/liblynq-driver-control/include/pwm/pwm.h
@@ -0,0 +1,5 @@
+#ifndef __PWM_H__
+#define __PWM_H__
+
+int factory_pwm_test(void);
+#endif //__PWM_H__
\ No newline at end of file
diff --git a/src/lynq/lib/liblynq-driver-control/include/spi/spi.h b/src/lynq/lib/liblynq-driver-control/include/spi/spi.h
new file mode 100644
index 0000000..d1aeb51
--- /dev/null
+++ b/src/lynq/lib/liblynq-driver-control/include/spi/spi.h
@@ -0,0 +1,8 @@
+#ifndef __SPI_H__
+#define __SPI_H__
+int lynq_spi_recv_data(char *spi_data,unsigned int spi_len);
+int lynq_spi_send_data(char *spi_data,unsigned int spi_len);
+int lynq_spi_read_state(unsigned char spi_feature,unsigned int spi_valu);
+int lynq_spi_set_state(unsigned char spi_feature,unsigned int spi_valu);
+int lynq_spi_set_channel(unsigned char spi_channel);
+#endif //__SPI_H__
diff --git a/src/lynq/lib/liblynq-driver-control/include/uart/uart.h b/src/lynq/lib/liblynq-driver-control/include/uart/uart.h
new file mode 100644
index 0000000..69998e9
--- /dev/null
+++ b/src/lynq/lib/liblynq-driver-control/include/uart/uart.h
@@ -0,0 +1,5 @@
+#ifndef __UART_H__
+#define __UART_H__
+
+int lynq_set_uart_param(int device_node,int nSpeed, int nBits, char nEvent, int nStop);
+#endif //__SPI_H__
\ No newline at end of file
diff --git a/src/lynq/lib/liblynq-driver-control/liblynq-driver-control/adc/adc.c b/src/lynq/lib/liblynq-driver-control/liblynq-driver-control/adc/adc.c
new file mode 100644
index 0000000..36aa3c1
--- /dev/null
+++ b/src/lynq/lib/liblynq-driver-control/liblynq-driver-control/adc/adc.c
@@ -0,0 +1,80 @@
+#include <stdio.h>
+#include <stdlib.h>
+#include <fcntl.h>
+#include <unistd.h>
+#include <math.h> 
+#include <string.h>
+#include "adc.h"
+
+char iiotype[10][64] = {
+	"in_voltage21_GPS_ANT_input",//vin6
+	"in_voltage22_MAIN_ANT_input",//vin7
+	"in_voltage23_DRX_ANT_input",//vin8
+}; 	
+
+
+FILE *device_fp;
+int lynq_set_adc_channel(unsigned char channel_val)
+{
+	int ret = 0;
+	char filename[80];	
+	sprintf(filename, "/sys/bus/iio/devices/iio:device0/%s", iiotype[channel_val]);
+	device_fp = fopen(filename, "rt" );
+	if(device_fp == NULL)
+	{
+		printf("open %s fail!\n", filename);
+		ret = -1;
+	}
+	return ret;
+}
+
+float lynq_get_adc_data(void)
+{
+	float fvoltage = 0;
+	int value = 0;
+	char buf[20];
+	int ret = 0;
+	
+	ret = fread( buf, 1, sizeof(buf), device_fp);
+	fclose(device_fp);
+	if(ret == 0)
+	{
+		printf("read adc error !!!\n");
+		return -1;
+	}
+	// convert to integer
+	sscanf( buf, "%d", &value);
+	printf("value:%d\n",value);
+	fvoltage = 0.001 * value;
+	printf("fvoltage:%.3f\n",fvoltage);
+	return fvoltage;
+}
+
+
+int factory_adc_test(void)
+{
+	int ret = 0;
+	float fvalue;
+	int i = 0;
+
+	// read AIN1
+	while(1)
+	{
+		i = 0;
+		printf("-----------------------------------------\n");
+		for(i = 0;i < 3;i++)
+		{
+			ret = lynq_set_adc_channel(i);
+			if(ret < 0)
+			{
+				printf("set adc channel error\n");
+			}
+			fvalue = lynq_get_adc_data();
+			printf("vin(%d) = %.3fV\n",i+6,fvalue);			
+		}
+		printf("-----------------------------------------\n");
+		sleep(5);
+	}
+	  
+	return ret;
+}
\ No newline at end of file
diff --git a/src/lynq/lib/liblynq-driver-control/liblynq-driver-control/driver_control.c b/src/lynq/lib/liblynq-driver-control/liblynq-driver-control/driver_control.c
new file mode 100644
index 0000000..62137a5
--- /dev/null
+++ b/src/lynq/lib/liblynq-driver-control/liblynq-driver-control/driver_control.c
@@ -0,0 +1,236 @@
+#include <stdio.h>
+#include <string.h>
+#include <pthread.h>
+#include <ctype.h>
+#include <stdlib.h>
+#include <errno.h>
+#include <fcntl.h>
+#include <gio/gio.h>
+#include <log/log.h>
+#include <glib.h>
+#include "libdriver.h"
+#define GPIO_SERVICE "gpio.lynq" /*well-known bus name */
+#define GPIO_DATA_INTERFACE "gpio.lynq.Data" /*interface name*/
+#define GPIO_DATA_PATH "/gpio/lynq/data" /*object name*/
+#define LOG_TAG "GPIO_CONTROL"
+static GMainLoop *loop = NULL;
+static GDBusProxy *pProxy = NULL;
+triggerCallback mtriggerCallback = NULL;;
+
+void proxy_signals_on_signal (GDBusProxy  *proxy,
+                              const gchar *sender_name,
+                              const gchar *signal_name,
+                              GVariant    *parameters,
+                              gpointer     user_data)
+{
+    gint32 status;
+    RLOGD("signal_name: %s\n", signal_name);
+    g_variant_get (parameters,"(i)",&status);
+    //RLOGD("listen singal ok,%d",status);
+    if(mtriggerCallback){
+        mtriggerCallback(signal_name,status);
+    }
+    else
+    {
+        RLOGE("mbroadcastcallback NULL");
+    }
+    printf("trigger status is %d\n",status);
+}
+
+BOOL registerClientSignalHandler(GDBusProxy *proxy)
+{
+    gulong signal_handler_id;
+    signal_handler_id = g_signal_connect(proxy, "g-signal",
+                      G_CALLBACK (proxy_signals_on_signal), NULL);
+    RLOGD("proxy is ready");
+    if (signal_handler_id == 0) {
+        RLOGD("listen singal fail!");
+        return FALSE;
+    }
+    return TRUE;
+}
+void registerTriggerCallback(triggerCallback callback)
+{
+    if (NULL != callback){
+        //memcpy(&mbroadcastcallback, callback, sizeof(broadcastCallback));
+        mtriggerCallback = callback;
+    }
+    else{
+        RLOGD("registerSignalCallback: parameter point is NULL");
+    }
+}
+void *run(void* arg)
+{
+    
+    /** start the main event loop which manages all available sources of events */
+    g_main_loop_run(loop);
+    return ((void*)0);
+}
+
+void disconnect_key(void)
+{
+    if(pProxy != NULL) {
+        g_object_unref (pProxy);
+    }
+    if(loop != NULL) {
+        g_main_loop_unref(loop);
+    }
+}
+int thread_create(void)
+{
+    int err;
+    pthread_t thr;
+
+    err = pthread_create(&thr, NULL, run, NULL);
+    if(0 != err){
+            RLOGD("Can't create thread: %s\n", strerror(err));
+    }
+    else{       
+            RLOGD("New thread created: %s\n", strerror(err));
+    }
+
+    return err;
+}
+int trigger_loop()
+{
+    g_main_loop_run(loop);
+}
+
+BOOL service_ready(void)
+{
+    gchar *owner_name = NULL;
+    owner_name = g_dbus_proxy_get_name_owner((GDBusProxy*)pProxy);
+    if(NULL != owner_name)
+    {
+        RLOGD("Owner Name: %s\n", owner_name);        
+        g_free(owner_name);
+        return TRUE;
+    }
+    else
+    {   
+        g_print("Owner Name is NULL.");     
+        return FALSE;
+    }
+}
+
+void register_key_info(void){
+     GError *error = NULL;
+     RLOGD("go!\n");	
+        loop = g_main_loop_new(NULL, FALSE);
+
+        pProxy = g_dbus_proxy_new_for_bus_sync (G_BUS_TYPE_SYSTEM,
+                                         G_DBUS_PROXY_FLAGS_NONE,
+                                         NULL, /* GDBusInterfaceInfo */
+                                         GPIO_SERVICE,
+                                         GPIO_DATA_PATH,
+                                         GPIO_DATA_INTERFACE,
+                                         NULL, /* GCancellable */
+                                         &error);
+    if (pProxy == NULL)
+    {
+      RLOGD ("Error creating proxy: %s\n", error->message);
+      disconnect_key();
+    }
+    if (registerClientSignalHandler(pProxy)== FALSE){
+      RLOGD ("register Error");
+      disconnect_key();
+    }
+    while(service_ready() != TRUE);
+    thread_create();
+}
+
+int lynq_set_gpio (char * mode,int gpio_numb,int param)
+{
+    GDBusConnection *c1;
+    GVariant *result;
+    GError *error;
+    GMainLoop *loop;
+    gint32  set_result = -1;
+    g_type_init();
+    loop = g_main_loop_new(NULL, FALSE);   /** create main loop, but do not start it.*/
+    error = NULL;
+    c1 = g_bus_get_sync (G_BUS_TYPE_SYSTEM, NULL, &error);
+    g_assert_no_error (error);
+    error = NULL;
+    g_assert (c1 != NULL);
+    g_assert (!g_dbus_connection_is_closed (c1));
+    result = g_dbus_connection_call_sync (c1,
+                                        GPIO_SERVICE,  /* bus name */
+                                        GPIO_DATA_PATH, /* object path */
+                                        GPIO_DATA_INTERFACE,  /* interface name */
+                                        "setGpio",                 /* method name */
+                                        g_variant_new ("(sii)", mode,gpio_numb,param),  /* parameters */
+                                         G_VARIANT_TYPE ("(i)"),                    /* return type */
+                                        G_DBUS_CALL_FLAGS_NONE,
+                                        -1,
+                                        NULL,
+                                        &error);
+    g_assert_no_error (error);
+    g_assert (result != NULL);
+    g_variant_get(result, "(i)", &(set_result));
+   // RLOGD("%s, %s, %d,result:%d", __FILE__, __FUNCTION__, __LINE__,set_result);
+    g_variant_unref (result);
+    //g_main_loop_run (loop);
+    g_main_loop_unref (loop);
+    return set_result;
+}
+/*
+int set_gpio143(){
+  int   result;
+  result = set_gpio (GPIO_MODE,WIFI_LED_CONTROL,1);
+  return result;
+ // sprintf(output, "gpio set stauts %d\n",result);
+ // printf("%s",output);
+ // emResultNotify(output);
+}*/
+void lynq_get_gpio (int gpio_numb,char *response)
+{
+    GDBusConnection *c1;
+    GError *error;
+    GMainLoop *loop;
+    //char output[2048] = {0};
+    //gchar *response;
+    GVariant *get;
+    gsize n_elts=0;
+    GVariantIter *iter;
+    //guchar *response;
+    gchar *get_res;
+//	const char *p;
+    g_type_init();
+    loop = g_main_loop_new(NULL, FALSE);   /** create main loop, but do not start it.*/
+    error = NULL;
+    c1 = g_bus_get_sync (G_BUS_TYPE_SYSTEM, NULL, &error);
+    g_assert_no_error (error);
+    error = NULL;
+    g_assert (c1 != NULL);
+    g_assert (!g_dbus_connection_is_closed (c1));
+    error = NULL;
+    get = g_dbus_connection_call_sync (c1,
+                                        GPIO_SERVICE,  
+                                        GPIO_DATA_PATH, 
+                                        GPIO_DATA_INTERFACE,  
+                                        "getGpio",                 
+                                        g_variant_new ("(i)",gpio_numb), 
+                                         G_VARIANT_TYPE ("(s)"),                     
+                                        G_DBUS_CALL_FLAGS_NONE,
+                                        -1,
+                                        NULL,
+                                        &error);
+    g_assert_no_error (error);
+    g_assert (get != NULL);
+    g_variant_get (get, "(s)",&get_res);
+    strcpy(response, get_res);
+    g_variant_unref (get);
+    RLOGD("get_gpio,%s",response);
+    g_main_loop_unref (loop);
+}
+/*
+void get_gpio143(){
+  char output[1024] = {0};
+  char output1[2048] = {0};
+  get_gpio (WIFI_LED_CONTROL,output);
+  printf("get_gpio143,%s\n",output);
+ 
+}
+*/
+
diff --git a/src/lynq/lib/liblynq-driver-control/liblynq-driver-control/i2c/i2c.c b/src/lynq/lib/liblynq-driver-control/liblynq-driver-control/i2c/i2c.c
new file mode 100644
index 0000000..9a67ddf
--- /dev/null
+++ b/src/lynq/lib/liblynq-driver-control/liblynq-driver-control/i2c/i2c.c
@@ -0,0 +1,198 @@
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+#include<fcntl.h>
+#include "i2c.h"
+
+#define I2C_SEND_DATA_LEN 1024
+#define I2C_SEND_PTR_LEN 1024
+
+static char *device = "/proc/i2c_debug"; //设备名
+static int bus_id = 0;
+static int address = 0;
+static unsigned int speedhz = 0;
+static unsigned int red_length = 0;
+static int pows(int x, int y)
+{
+	int result = 1;
+
+	while (y--)
+		result *= x;
+	return result;
+}
+
+int string2hex(const char *buffer, int cnt)
+{
+	int c = 0;
+	char t = 0;
+	int count = cnt;
+
+	while (count--) {
+		t = *(buffer + cnt - count - 1);
+		if (t >= 'A' && t <= 'F')
+			c += ((t - 'A') + 10) * pows(16, count);
+			else if (t >= 'a' && t <= 'f')		
+			c += ((t - 'a') + 10) * pows(16, count);	
+		else if (t >= '0' && t <= '9')
+			c += (t - '0') * pows(16, count);
+		else
+			c = -1;
+	}
+	return c;
+}
+
+int get_hexbuffer(char *data_buffer, char *hex_buffer)
+{
+	char *ptr = data_buffer;
+	int index = 0;
+	int data_offset = 0;
+
+	while (*ptr && *++ptr) {
+		*(hex_buffer + index++) = string2hex(ptr - 1, 2);
+		ptr++;
+		data_offset++;
+	}
+	*(hex_buffer + index) = 0;
+	return data_offset;
+}
+
+static void hex2string(unsigned char *in, unsigned char *out, int length)
+{
+	unsigned char *ptr = in;
+	unsigned char *ptrout = out;
+	unsigned char t;
+
+	while (length--) {
+		t = (*ptr & 0xF0) >> 4;
+		if (t < 10)
+			*ptrout = t + '0';
+		else
+			*ptrout = t + 'A' - 10;
+
+		ptrout++;
+
+		t = (*ptr & 0x0F);
+		if (t < 10)
+			*ptrout = t + '0';
+		else
+			*ptrout = t + 'A' - 10;
+
+		ptr++;
+		ptrout++;
+	}
+	*ptrout = 0;
+}
+
+int lynq_set_i2c_deplop(int set_bus_id,int set_address,int set_speedhz,unsigned int rx_length)
+{
+	bus_id = set_bus_id;
+    address = set_address;
+    speedhz = set_speedhz;
+	red_length = rx_length;
+	return 1;
+}
+
+int lynq_i2c_tx(int wr_len,char *wr_buf)
+{
+	int fd;
+	int ret = 0;
+	char str[I2C_SEND_DATA_LEN + 64];
+	char *ptr_buf = NULL;
+
+	if((wr_len > (I2C_SEND_DATA_LEN / 2)) || (wr_buf == NULL))
+	{
+		return -1;
+	}
+	fd = open(device, O_RDWR);       //打开"/dev/i2c_debug"
+
+	if (fd < 0)
+	{
+	  printf("can't open device");
+	  ret = -1;
+	  return ret;
+	}
+
+	ptr_buf = malloc(I2C_SEND_PTR_LEN);
+	if(ptr_buf == NULL)
+	{
+		close(fd);
+		return -1;
+	}
+	hex2string(wr_buf,ptr_buf,wr_len);
+	
+	sprintf(str,"%d %x %d %d %d %d %s",bus_id,address,2,wr_len*2,red_length,speedhz,ptr_buf);
+	printf("%s\n",str);
+	write(fd,str,strlen(str));
+
+	close(fd);
+	free(ptr_buf);
+	ptr_buf = NULL;	
+	return ret;
+}
+
+int lynq_i2c_rx(int *rd_len, char *rd_buf)
+{
+	int fd;
+	int ret = 0;
+	char *ptr_buf = NULL;
+	
+	if(red_length > (I2C_SEND_DATA_LEN / 2))
+	{
+		return -1;
+	}	
+	fd = open(device, O_RDWR);       //打开"/dev/i2c_debug"
+
+	if (fd < 0)
+	{
+	  printf("can't open device");
+	  ret = -1;
+	  return ret;
+	}
+		
+	ptr_buf = malloc(I2C_SEND_PTR_LEN);
+	if(ptr_buf == NULL)
+	{
+		close(fd);	
+		return -1;
+	}
+	 *rd_len = read(fd,ptr_buf,I2C_SEND_PTR_LEN);
+
+	printf("rx:%s\n",ptr_buf);
+	if(ptr_buf[0] == 0x31) //字符串1
+	{
+		 *rd_len = get_hexbuffer(&ptr_buf[2],rd_buf);
+		printf("rd_len1:%d\n", *rd_len);
+	}
+	else
+	{
+		ret = -1;
+		printf("read error!!!\n");
+	}
+	close(fd);	
+	free(ptr_buf);
+	ptr_buf = NULL;	
+	return ret;
+}
+
+int factory_i2c_test(void)
+{
+	printf("i2c test start \n");
+	char rd_buf[1024] = {0};
+	int rd_len = 0;
+	char buf[10] = {1,2,3,4,5,6,7,8,9,128};
+	lynq_set_i2c_deplop(1,12,100000,20);
+	lynq_i2c_tx(sizeof(buf),buf);
+	lynq_i2c_rx(&rd_len,rd_buf);
+	printf("rd_len:%d\n",rd_len);
+	if(rd_len > 0)
+	{
+		printf("I2C_data:");
+		for(int i = 0; i < rd_len; i++)
+		{
+			printf("%02x ",rd_buf[i]);
+		}
+		printf("\n");	
+	}
+
+	return 1;
+}
\ No newline at end of file
diff --git a/src/lynq/lib/liblynq-driver-control/liblynq-driver-control/makefile b/src/lynq/lib/liblynq-driver-control/liblynq-driver-control/makefile
new file mode 100644
index 0000000..87afee6
--- /dev/null
+++ b/src/lynq/lib/liblynq-driver-control/liblynq-driver-control/makefile
@@ -0,0 +1,113 @@
+SHELL = /bin/sh
+RM = rm -f
+
+LOCAL_CFLAGS := -Wall \
+                -g -Os \
+                -flto \
+                -DRIL_SHLIB \
+                -DATCI_PARSE \
+                -DKEEP_ALIVE \
+                -DECALL_SUPPORT \
+
+$(warning ################# C2K support: $(RAT_CONFIG_C2K_SUPPORT))
+ifeq ($(strip $(RAT_CONFIG_C2K_SUPPORT)), yes)
+    LOCAL_CFLAGS += -DC2K_SUPPORT
+
+endif
+
+ifeq ($(strip $(MTK_MULTI_SIM_SUPPORT)), dsds)
+    LOCAL_CFLAGS += -DANDROID_SIM_COUNT_2 \
+                     -DANDROID_MULTI_SIM \
+                     -DMODE_DSDS
+endif
+
+ifeq ($(strip $(MTK_MULTI_SIM_SUPPORT)), dsss)
+    LOCAL_CFLAGS += -DMODE_DSSS
+endif
+
+$(warning ################# TARGET_PLATFORM: $(TARGET_PLATFORM))
+ifeq ($(strip $(TARGET_PLATFORM)), mt2731)
+#$(warning #################add for debug $(ROOT), $(includedir))
+$(warning ################# TARGET_PLATFORM_MT2731)
+    LOCAL_CFLAGS += -DTARGET_PLATFORM_MT2731 \
+                    -DMD_93_SUPPORT
+else ifeq ($(strip $(TARGET_PLATFORM)), mt2635)
+$(warning ################# TARGET_PLATFORM_MT2635)
+    LOCAL_CFLAGS += -DTARGET_PLATFORM_MT2635 \
+                    -DMD_90_SUPPORT
+endif
+
+$(warning ################# RITA ROOT: $(ROOT),includedir:$(includedir))
+LOCAL_PATH   = .
+
+LOCAL_C_INCLUDES = \
+  -I. \
+  -I$(LOCAL_PATH)/../include/liblynq-driver-control \
+  -I$(LOCAL_PATH)/../include/adc \
+  -I$(LOCAL_PATH)/../include/i2c \
+  -I$(LOCAL_PATH)/../include/pwm \
+  -I$(LOCAL_PATH)/../include/spi \
+  -I$(LOCAL_PATH)/../include/uart \
+  -I$(ROOT)$(includedir)/logger \
+  -I$(ROOT)$(includedir)/gstreamer-1.0 \
+  -I$(ROOT)$(includedir)/glib-2.0 \
+  -I$(ROOT)$(libdir)/glib-2.0/include \
+  -I$(ROOT)$(libdir)/gstreamer-1.0/include\
+  -I$(ROOT)$(includedir)/dbus-1.0 \
+  -I$(ROOT)$(libdir)/dbus-1.0/include \
+
+
+LOCAL_LIBS := \
+    -L. \
+    -ldl \
+    -lstdc++ \
+    -llog \
+    -lcutils \
+    -lutils \
+    -lpower \
+    -lbinder \
+    -lpthread \
+    -lpal \
+    -lgstreamer-1.0 \
+    -lglib-2.0 \
+    -lgstbase-1.0 \
+    -lgstreamer-1.0 \
+    -lgobject-2.0 \
+    -lgio-2.0 \
+    -ldtmf \
+    -ldbus-1 \
+
+SOURCES = $(wildcard *.c wildcard *.h lynq_mqtt/*.c adc/*.c i2c/*.c pwm/*.c spi/*.c uart/*.c)
+
+EXECUTABLE = liblynq-driver-control.so
+
+OBJECTS=$(SOURCES:.c=.o)
+
+
+.PHONY: build clean install pack_rootfs 
+
+all: build
+$(EXECUTABLE): $(OBJECTS)
+	$(CXX) -shared -Wl,--no-undefined $(OBJECTS) $(LOCAL_LIBS) $(LOCAL_CFLAGS) $(LOCAL_C_INCLUDES) -o $@
+
+%.o : %.c
+	$(CC) $(LOCAL_C_INCLUDES) $(LOCAL_CFLAGS) $(LOCAL_LIBS) -o $@ -c $< 
+
+build:  $(EXECUTABLE)
+	$(warning ########## build $(EXECUTABLE)  ##########)
+
+install:
+	mkdir -p $(ROOT)$(base_libdir)/
+	install $(EXECUTABLE) $(ROOT)$(base_libdir)/
+	mkdir -p $(ROOT)$(includedir)/$(NAME)/sdk
+
+pack_rootfs:
+	mkdir -p $(PACK_INITRAMFS_TO)$(base_libdir)/
+	cp -af $(EXECUTABLE) $(PACK_INITRAMFS_TO)$(base_libdir)/
+	$(CROSS)strip $(PACK_INITRAMFS_TO)$(base_libdir)/$(EXECUTABLE)
+	mkdir -p $(PACK_TO)$(base_libdir)/
+	cp -af $(EXECUTABLE) $(PACK_TO)$(base_libdir)/
+	$(CROSS)strip $(PACK_TO)$(base_libdir)/$(EXECUTABLE)
+.PHONY: clean
+clean:
+	$(RM) $(OBJECTS) $(EXECUTABLE)
diff --git a/src/lynq/lib/liblynq-driver-control/liblynq-driver-control/pwm/pwm.c b/src/lynq/lib/liblynq-driver-control/liblynq-driver-control/pwm/pwm.c
new file mode 100644
index 0000000..94c974b
--- /dev/null
+++ b/src/lynq/lib/liblynq-driver-control/liblynq-driver-control/pwm/pwm.c
@@ -0,0 +1,30 @@
+#include <stdio.h>
+#include<stdlib.h>
+#include <string.h>
+#include "pwm.h"
+
+void lynq_enable_pwm0_parameterize(unsigned int pwm_units,unsigned int duty_cycle)
+{
+	char *open_pwm0 = "echo 0 > /sys/class/pwm/pwmchip0/export";
+	char *enable_pwm0 = "echo 1 >/sys/class/pwm/pwmchip0/pwm0/enable";
+	char pwm_units_buff[128] = {0};
+	char duty_cycle_buff[128] ={0};
+	
+	system(open_pwm0);
+	
+	sprintf(pwm_units_buff,"echo %d >/sys/class/pwm/pwmchip0/pwm0/period",pwm_units);
+	printf("%s\n",pwm_units_buff);
+	system(pwm_units_buff);
+	
+	sprintf(duty_cycle_buff,"echo %d >/sys/class/pwm/pwmchip0/pwm0/period",duty_cycle);
+	printf("%s\n",duty_cycle_buff);
+	system(duty_cycle_buff);
+	
+	system(enable_pwm0);
+}
+
+int factory_pwm_test(void) //gpio89做测试
+{
+	system("echo mode 89 1 > /sys/devices/platform/10005000.pinctrl/mt_gpio");
+	lynq_enable_pwm0_parameterize(1000000,500000);
+}
\ No newline at end of file
diff --git a/src/lynq/lib/liblynq-driver-control/liblynq-driver-control/spi/spi.c b/src/lynq/lib/liblynq-driver-control/liblynq-driver-control/spi/spi.c
new file mode 100644
index 0000000..ebf4c6a
--- /dev/null
+++ b/src/lynq/lib/liblynq-driver-control/liblynq-driver-control/spi/spi.c
@@ -0,0 +1,382 @@
+#include <stdint.h>
+#include <unistd.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <getopt.h>
+#include <fcntl.h>
+#include <sys/ioctl.h>
+#include <linux/types.h>
+#include <linux/spi/spidev.h>
+#include "spi.h"
+
+#define ARRAY_SIZE(a) (sizeof(a) / sizeof((a)[0]))
+
+static void pabort(const char *s)
+
+{
+
+      perror(s);
+
+      abort();
+
+}
+
+static char *device = "/dev/spidev2.0"; //设备名
+
+static uint8_t mode;
+
+static uint8_t bits = 8;
+
+static uint32_t speed = 500000;
+
+static uint16_t delay;
+
+static void transfer(int fd)
+
+{
+
+      int ret;
+
+      uint8_t tx[] = {      //定义待发送的数据
+
+             0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+
+             0x40, 0x00, 0x00, 0x00, 0x00, 0x95,
+
+             0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+
+             0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+
+             0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+
+             0xDE, 0xAD, 0xBE, 0xEF, 0xBA, 0xAD,
+
+             0xF0, 0x0D,
+
+      };
+
+      uint8_t rx[ARRAY_SIZE(tx)] = {0, };
+
+      struct spi_ioc_transfer tr = {
+             .tx_buf = (unsigned long)tx,   //定义发送缓冲区指针
+
+             .rx_buf = (unsigned long)rx,   //定义接收缓冲区指针
+
+             .len = ARRAY_SIZE(tx),                    
+
+             .delay_usecs = delay,
+
+             .speed_hz = speed,
+
+             .bits_per_word = bits,
+
+      };
+
+      ret = ioctl(fd, SPI_IOC_MESSAGE(1), &tr);//执行spidev.c中ioctl的default进行数据传输
+
+      if (ret == 1)
+
+             pabort("can't send spi message");
+
+      for (ret = 0; ret < ARRAY_SIZE(tx); ret++) {
+             if (!(ret % 6))
+
+                    puts("");
+
+             printf("%.2X ", rx[ret]);      //打印接收到的数据
+
+      }
+
+      puts("");
+
+}
+
+int lynq_spi_set_channel(unsigned char spi_channel)
+{
+	int ret = 0;
+	switch(spi_channel){
+		case 0:{
+			device = "/dev/spidev0.0";
+			break;
+		}
+		case 1:{
+			device = "/dev/spidev1.0";
+			break;
+		}
+		case 2:{
+			device = "/dev/spidev2.0";
+			break;
+		}
+		case 3:{
+			device = "/dev/spidev3.0";
+			break;
+		}
+		default:{
+			printf("spi%d channel not exist\n",spi_channel);
+			ret = -1;
+			break;
+		}
+	}
+	printf("open %s\n",device);
+	return ret;
+}
+
+
+int lynq_spi_set_state(unsigned char spi_feature,unsigned int spi_valu)
+{
+	int ret = 0;
+	int fd;
+
+	fd = open(device, O_RDWR);       //打开"/dev/spidev1.0"
+    if (fd < 0)
+	{
+		pabort("can't open device");
+		ret = -1;		
+  	}
+
+	switch(spi_feature)
+	{
+		case 1:{
+		    ret = ioctl(fd, SPI_IOC_WR_MODE, &spi_valu);  //SPI模式设置可写
+			if (ret == -1){
+				pabort("can't set spi mode");	
+			}
+			break;
+		}
+		
+		case 2:{
+			ret = ioctl(fd, SPI_IOC_WR_BITS_PER_WORD, &spi_valu);  //SPI的bit/word设置可写
+			if (ret == -1){
+			    pabort("can't set bits per word");			
+			}
+			break;
+		}
+		case 3:{
+			ret = ioctl(fd, SPI_IOC_WR_MAX_SPEED_HZ, &spi_valu);     //SPI的波特率设置可写
+			if (ret == -1){
+			    pabort("can't set max speed hz");	
+			}
+			break;
+		}
+		default:
+		{
+			printf("can not spi feature\n");
+			break;
+		}
+	}
+	close(fd);
+	return ret;
+}
+
+int lynq_spi_read_state(unsigned char spi_feature,unsigned int spi_valu)
+{
+	int ret = 0;
+	int fd;
+	fd = open(device, O_RDWR);       //打开"/dev/spidev1.0"
+    if (fd < 0)
+	{
+		pabort("can't open device");	
+		ret = -1;
+  	}	
+	switch(spi_feature)
+	{
+		case 1:{
+		    ret = ioctl(fd, SPI_IOC_RD_MODE, &spi_valu);  //SPI模式设置可写
+			if (ret == -1){
+				pabort("can't set spi mode");	
+			}
+			break;
+		}
+		
+		case 2:{
+			ret = ioctl(fd, SPI_IOC_RD_BITS_PER_WORD, &spi_valu);  //SPI的bit/word设置可写
+			if (ret == -1){
+			    pabort("can't set bits per word");			
+			}
+			break;
+		}
+		case 3:{
+			ret = ioctl(fd, SPI_IOC_RD_MAX_SPEED_HZ, &spi_valu);     //SPI的波特率设置可写
+			if (ret == -1){
+			    pabort("can't set max speed hz");	
+			}
+			break;
+		}
+		default:
+		{
+			printf("can not spi feature\n");
+			break;
+		}
+	}
+	close(fd);
+	return ret;
+}
+
+int lynq_spi_send_data(char *spi_data,unsigned int spi_len)
+{
+	
+    int ret;
+	int fd;
+	fd = open(device, O_RDWR);       //打开"/dev/spidev1.0"
+    if (fd < 0)
+	{
+		pabort("can't open device");	
+		ret = -1;
+  	}
+	
+    ret = write(fd,spi_data,spi_len);
+    close(fd);         
+	return ret;
+     
+}
+
+int lynq_spi_recv_data(char *spi_data,unsigned int spi_len)
+{
+	
+    int ret;
+	int fd;
+	fd = open(device, O_RDWR);       //打开"/dev/spidev1.0"
+    if (fd < 0)
+	{
+		pabort("can't open device");	
+		ret = -1;
+  	}
+	
+    ret = read(fd,spi_data,spi_len);
+	close(fd);
+	return ret;
+     
+}
+
+#if 0
+int factory_spi_test(void)
+{
+
+      int ret = 0;
+
+      int fd;
+
+      mode |= SPI_CPHA;
+
+      mode |= SPI_CPOL;
+
+      mode &= ~SPI_CS_HIGH;
+
+      fd = open(device, O_RDWR);       //打开"/dev/spidev1.0"
+
+      if (fd < 0)
+
+             pabort("can't open device");
+
+      ret = ioctl(fd, SPI_IOC_WR_MODE, &mode);  //SPI模式设置可写
+
+      if (ret == -1)
+
+             pabort("can't set spi mode");
+
+      ret = ioctl(fd, SPI_IOC_RD_MODE, &mode); //SPI模式设置可读
+
+      if (ret == -1)
+
+             pabort("can't get spi mode");
+
+      ret = ioctl(fd, SPI_IOC_WR_BITS_PER_WORD, &bits);  //SPI的bit/word设置可写
+
+      if (ret == -1)
+
+             pabort("can't set bits per word");
+
+      ret = ioctl(fd, SPI_IOC_RD_BITS_PER_WORD, &bits);   //SPI的bit/word设置可读
+
+      if (ret == -1)
+
+             pabort("can't get bits per word");
+
+      ret = ioctl(fd, SPI_IOC_WR_MAX_SPEED_HZ, &speed);     //SPI的波特率设置可写
+
+      if (ret == -1)
+
+             pabort("can't set max speed hz");
+
+      ret = ioctl(fd, SPI_IOC_RD_MAX_SPEED_HZ, &speed);   //SPI的波特率设置可读
+
+      if (ret == -1)
+
+             pabort("can't get max speed hz");
+
+      printf("spi mode: %d\n", mode);
+
+      printf("bits per word: %d\n", bits);
+
+      printf("max speed: %d Hz (%d KHz)\n", speed, speed/1000);
+
+      transfer(fd);                                                        //数据传输
+
+      close(fd);
+
+      return ret;
+
+}
+#else
+int factory_spi_test(void)
+{
+	int tx_re_st = 0;
+	int rx_re_st = 0;
+	uint8_t tx[] = {0};
+	/*
+      uint8_t tx[] = {      //定义待发送的数据
+
+             0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+
+             0x40, 0x00, 0x00, 0x00, 0x00, 0x95,
+
+             0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+
+             0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+
+             0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+
+             0xDE, 0xAD, 0xBE, 0xEF, 0xBA, 0xAD,
+
+             0xF0, 0x0D,
+
+      };*/
+	  uint8_t rx[100] = {};
+	  
+	mode |= SPI_CPHA;
+
+    mode |= SPI_CPOL;
+
+    mode &= ~SPI_CS_HIGH;
+	
+	lynq_spi_set_channel(2); //打开"/dev/spidev2.0"
+		
+	lynq_spi_set_state(1,mode);
+	lynq_spi_set_state(2,bits);
+	lynq_spi_set_state(3,speed);
+	
+	lynq_spi_read_state(1,&mode);
+	lynq_spi_read_state(2,&bits);
+	lynq_spi_read_state(3,&speed);
+	
+	printf("spi mode: %d\n", mode);
+
+    printf("bits per word: %d\n", bits);
+
+    printf("max speed: %d Hz (%d KHz)\n", speed, speed/1000);
+	
+	tx_re_st = lynq_spi_send_data(tx,sizeof(tx));
+	
+	rx_re_st = lynq_spi_recv_data(rx,sizeof(tx));
+	
+	printf("tx_re_st:%d---rx_re_st:%d\n",tx_re_st,rx_re_st);
+	for (int ret = 0; ret < sizeof(tx); ret++) {
+       if (!(ret % 6))
+             puts("");
+        printf("%.2X ", rx[ret]);      //打印接收到的数据
+
+      }
+
+      puts("");
+}
+#endif
\ No newline at end of file
diff --git a/src/lynq/lib/liblynq-driver-control/liblynq-driver-control/uart/uart.c b/src/lynq/lib/liblynq-driver-control/liblynq-driver-control/uart/uart.c
new file mode 100644
index 0000000..7f6b438
--- /dev/null
+++ b/src/lynq/lib/liblynq-driver-control/liblynq-driver-control/uart/uart.c
@@ -0,0 +1,335 @@
+#include "uart.h"
+#include <stdio.h>
+#include <string.h>
+#include <sys/types.h>
+#include <errno.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+#include <unistd.h>
+#include <termios.h>
+#include <stdlib.h>
+
+int set_opt(int fd,int nSpeed, int nBits, char nEvent, int nStop)
+{
+    struct termios newtio,oldtio;
+    if  ( tcgetattr( fd,&oldtio)  !=  0) 
+    { 
+        perror("SetupSerial 1");
+        return -1;
+    }
+    bzero( &newtio, sizeof( newtio ) );
+    newtio.c_cflag  |=  CLOCAL | CREAD; 
+    newtio.c_cflag &= ~CSIZE; 
+
+    switch( nBits )
+    {
+    case 5:
+        newtio.c_cflag |= CS5;
+        break;
+    case 6:
+        newtio.c_cflag |= CS6;
+        break;
+    case 7:
+        newtio.c_cflag |= CS7;
+        break;
+    case 8:
+        newtio.c_cflag |= CS8;
+        break;
+    default:
+        newtio.c_cflag |= CS8;
+        break;
+    }
+
+    switch( nEvent )
+    {
+    case 'O':                     //奇校验
+        newtio.c_cflag |= PARENB;
+        newtio.c_cflag |= PARODD;
+        newtio.c_iflag |= (INPCK | ISTRIP);
+        break;
+    case 'E':                     //偶校验
+        newtio.c_iflag |= (INPCK | ISTRIP);
+        newtio.c_cflag |= PARENB;
+        newtio.c_cflag &= ~PARODD;
+        break;
+    case 'N':                    //无校验
+        newtio.c_cflag &= ~PARENB;
+        break;
+	default:                    //无校验
+		newtio.c_cflag &= ~PARENB;
+		break;
+    }
+
+switch( nSpeed )
+    {
+    case 2400:
+        cfsetispeed(&newtio, B2400);
+        cfsetospeed(&newtio, B2400);
+        break;
+    case 4800:
+        cfsetispeed(&newtio, B4800);
+        cfsetospeed(&newtio, B4800);
+        break;
+    case 9600:
+        cfsetispeed(&newtio, B9600);
+        cfsetospeed(&newtio, B9600);
+        break;
+    case 115200:
+        cfsetispeed(&newtio, B115200);
+        cfsetospeed(&newtio, B115200);
+        break;
+    default:
+        cfsetispeed(&newtio, B9600);
+        cfsetospeed(&newtio, B9600);
+        break;
+    }
+    if( nStop == 1 )
+    {
+        newtio.c_cflag &=  ~CSTOPB;
+    }
+    else if ( nStop == 2 )
+    {
+        newtio.c_cflag |=  CSTOPB;
+    }
+	else
+	{
+		newtio.c_cflag &=  ~CSTOPB;
+	}
+    newtio.c_cc[VTIME]  = 0;
+    newtio.c_cc[VMIN] = 0;
+    tcflush(fd,TCIFLUSH);
+    if((tcsetattr(fd,TCSANOW,&newtio))!=0)
+    {
+        perror("com set error");
+        return -1;
+    }
+    printf("set done!\n");
+    return 0;
+}
+
+int open_port(int fd,int comport)
+{
+ //   char *dev[]={"/dev/ttyS0","/dev/ttyS1","/dev/ttyS2"};
+    long  vdisable;
+    if (comport==1)
+    {    fd = open( "/dev/ttyS0", O_RDWR|O_NOCTTY|O_NONBLOCK);
+        if (-1 == fd)
+        {
+            perror("Can't Open Serial Port");
+            return(-1);
+        }
+        else 
+        {
+            printf("open ttyS0 .....\n");
+        }
+    }
+    else if(comport==2)
+    {    fd = open( "/dev/ttyS1", O_RDWR|O_NOCTTY|O_NONBLOCK);
+        if (-1 == fd)
+        {
+            perror("Can't Open Serial Port");
+            return(-1);
+        }
+        else 
+        {
+            printf("open ttyS1 .....\n");
+        }    
+    }
+    else if (comport==3)
+    {
+        fd = open( "/dev/ttyS2", O_RDWR|O_NOCTTY|O_NONBLOCK);
+        if (-1 == fd)
+        {
+            perror("Can't Open Serial Port");
+            return(-1);
+        }
+        else 
+        {
+            printf("open ttyS2 .....\n");
+        }
+    }
+    if(fcntl(fd, F_SETFL, 0)<0)
+    {
+        printf("fcntl failed!\n");
+    }
+    else
+    {
+        printf("fcntl=%d\n",fcntl(fd, F_SETFL,0));
+    }
+    if(isatty(STDIN_FILENO)==0)
+    {
+        printf("standard input is not a terminal device\n");
+    }
+    else
+    {
+        printf("isatty success!\n");
+    }
+    printf("fd-open=%d\n",fd);
+    return fd;
+}
+
+int lynq_set_uart_param(int device_node,int nSpeed, int nBits, char nEvent, int nStop)
+{
+	int fd;
+	switch(device_node)
+	{
+	case 0:
+		fd = open( "/dev/ttyS0", O_RDWR|O_NOCTTY|O_NONBLOCK);
+        if (-1 == fd)
+        {
+            perror("Can't Open Serial Port");
+            return(-1);
+        }
+        else 
+        {
+            printf("open ttyS0 .....\n");
+        }		
+		break;
+	case 1:
+		fd = open( "/dev/ttyS1", O_RDWR|O_NOCTTY|O_NONBLOCK);
+        if (-1 == fd)
+        {
+            perror("Can't Open Serial Port");
+            return(-1);
+        }
+        else 
+        {
+            printf("open ttyS1 .....\n");
+        }		
+		break;
+	case 2:
+		fd = open( "/dev/ttyS2", O_RDWR|O_NOCTTY|O_NONBLOCK);
+        if (-1 == fd)
+        {
+            perror("Can't Open Serial Port");
+            return(-1);
+        }
+        else 
+        {
+            printf("open ttyS2 .....\n");
+        }		
+		break;
+	case 3:
+		fd = open( "/dev/ttyS3", O_RDWR|O_NOCTTY|O_NONBLOCK);
+        if (-1 == fd)
+        {
+            perror("Can't Open Serial Port");
+            return(-1);
+        }
+        else 
+        {
+            printf("open ttyS3 .....\n");
+        }		
+		break;
+	case 4:
+		fd = open( "/dev/ttyS4", O_RDWR|O_NOCTTY|O_NONBLOCK);
+        if (-1 == fd)
+        {
+            perror("Can't Open Serial Port");
+            return(-1);
+        }
+        else 
+        {
+            printf("open ttyS4 .....\n");
+        }		
+		break;
+	case 5:
+		fd = open( "/dev/ttyS5", O_RDWR|O_NOCTTY|O_NONBLOCK);
+        if (-1 == fd)
+        {
+            perror("Can't Open Serial Port");
+            return(-1);
+        }
+        else 
+        {
+            printf("open ttyS5 .....\n");
+        }		
+		break;
+	case 6:
+		fd = open( "/dev/ttyS6", O_RDWR|O_NOCTTY|O_NONBLOCK);
+        if (-1 == fd)
+        {
+            perror("Can't Open Serial Port");
+            return(-1);
+        }
+        else 
+        {
+            printf("open ttyS6 .....\n");
+        }		
+		break;
+	default:
+		fd = -1;
+		break;
+	}
+	
+	printf("fd-open=%d\n",fd);
+	
+	if(set_opt(fd,nSpeed,nBits,nEvent,nStop) == -1)
+	{
+		fd = -1;
+		printf("set uart speed,nbits,nevent,stop,error!!!\n");
+	}
+    return fd;
+}
+
+#if 0
+int factory_uart_test(void)
+{
+    int fd;
+    int nread,i,wread;
+	char wr_buf[] = "Hello";
+    char rx_buff[128]= {};
+
+    if((fd=open_port(fd,3))<0)
+    {
+        perror("open_port error");
+        return;
+    }
+    if((i=set_opt(fd,9600,8,'N',1))<0)
+    {
+        perror("set_opt error");
+        return -1;
+    }
+	
+    printf("fd=%d\n",fd);
+	
+	while(1)
+	{
+		sleep(2);
+		memset(rx_buff,0,128);
+		nread=read(fd,rx_buff,128);
+		printf("nread=%d,%s\n",nread,rx_buff);
+		sleep(1);
+		wread = write(fd,wr_buf,strlen(wr_buf));
+	}
+    close(fd);
+    return 1;
+}
+#else
+int factory_uart_test(void)
+{
+    int fd;
+    int nread,i,wread;
+	char wr_buf[] = "Hello";
+    char rx_buff[128]= {};
+
+	if((fd = lynq_set_uart_param(2,9600,8,'N',1))<0)
+	{
+		perror("open_port-set_opt error");
+	}
+	
+    printf("fd=%d\n",fd);
+	
+	while(1)
+	{
+		sleep(2);
+		memset(rx_buff,0,128);
+		nread=read(fd,rx_buff,128);
+		printf("nread=%d,%s\n",nread,rx_buff);
+		sleep(1);
+		wread = write(fd,wr_buf,strlen(wr_buf));
+	}
+    close(fd);
+    return 1;
+}
+#endif
\ No newline at end of file
