xref: /OK3568_Linux_fs/external/rk_pcba_test/echo_bt_test.c (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun /*
2*4882a593Smuzhiyun  *  bluetooth_test.c  --  bluetooth test application
3*4882a593Smuzhiyun  *
4*4882a593Smuzhiyun  *  Copyright (c) 2017 Rockchip Electronics Co. Ltd.
5*4882a593Smuzhiyun  *  Author: Panzhenzhuan Wang <randy.wang@rock-chips.com>
6*4882a593Smuzhiyun  *
7*4882a593Smuzhiyun  * Licensed under the Apache License, Version 2.0 (the "License");
8*4882a593Smuzhiyun  * you may not use this file except in compliance with the License.
9*4882a593Smuzhiyun  * You may obtain a copy of the License at
10*4882a593Smuzhiyun  *
11*4882a593Smuzhiyun  * 	 http://www.apache.org/licenses/LICENSE-2.0
12*4882a593Smuzhiyun  *
13*4882a593Smuzhiyun  * Unless required by applicable law or agreed to in writing, software
14*4882a593Smuzhiyun  * distributed under the License is distributed on an "AS IS" BASIS,
15*4882a593Smuzhiyun  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16*4882a593Smuzhiyun  * See the License for the specific language governing permissions and
17*4882a593Smuzhiyun  * limitations under the License.
18*4882a593Smuzhiyun  */
19*4882a593Smuzhiyun #include <stdio.h>
20*4882a593Smuzhiyun #include <stdlib.h>
21*4882a593Smuzhiyun #include <string.h>
22*4882a593Smuzhiyun #include <malloc.h>
23*4882a593Smuzhiyun 
24*4882a593Smuzhiyun //*open ��������ͷ�ļ�
25*4882a593Smuzhiyun #include <sys/types.h>
26*4882a593Smuzhiyun #include <sys/stat.h>
27*4882a593Smuzhiyun #include <fcntl.h>
28*4882a593Smuzhiyun #include <unistd.h>
29*4882a593Smuzhiyun 
30*4882a593Smuzhiyun //error ���ͷ�ļ�
31*4882a593Smuzhiyun #include <errno.h>
32*4882a593Smuzhiyun #include "bt_test.h"
33*4882a593Smuzhiyun 
34*4882a593Smuzhiyun //_IOW ����ͷ�ļ�
35*4882a593Smuzhiyun #include <sys/ioctl.h>
36*4882a593Smuzhiyun //WIFEXITED ����ͷ�ļ�
37*4882a593Smuzhiyun #include <sys/wait.h>
38*4882a593Smuzhiyun 
39*4882a593Smuzhiyun #define LOG_TAG "bt_test"
40*4882a593Smuzhiyun #include "common.h"
41*4882a593Smuzhiyun 
42*4882a593Smuzhiyun //*����ѭ����ȡ������ַʱ�����Լ���ʱʱ��
43*4882a593Smuzhiyun #define PERIOD_TIME 1
44*4882a593Smuzhiyun #define BT_TIMEOUT_FIRMWARE 7
45*4882a593Smuzhiyun 
46*4882a593Smuzhiyun #define BT_PROC_ERR -30
47*4882a593Smuzhiyun #define BT_FIRMWARE_LOAD_ERR -31
48*4882a593Smuzhiyun 
49*4882a593Smuzhiyun #define WIFI_CHIP_TYPE_PATH "/sys/class/rkwifi/chip"
50*4882a593Smuzhiyun #define BT_ON 1
51*4882a593Smuzhiyun #define BT_OFF 0
52*4882a593Smuzhiyun 
53*4882a593Smuzhiyun #define BT_INIT_ADDR "00:00:00:00:00:00"
54*4882a593Smuzhiyun 
55*4882a593Smuzhiyun #ifndef HCI_DEV_ID
56*4882a593Smuzhiyun #define HCI_DEV_ID 0
57*4882a593Smuzhiyun #endif
58*4882a593Smuzhiyun 
59*4882a593Smuzhiyun enum WIFI_CHIP_TYPE_LIST{
60*4882a593Smuzhiyun     BT_UNKNOWN = -1,
61*4882a593Smuzhiyun 	BCM4329 = 0,
62*4882a593Smuzhiyun 	RTL8188CU,
63*4882a593Smuzhiyun 	RTL8188EU,
64*4882a593Smuzhiyun 	BCM4330,
65*4882a593Smuzhiyun 	RK901,
66*4882a593Smuzhiyun 	RK903,
67*4882a593Smuzhiyun 	MT6620,
68*4882a593Smuzhiyun 	RT5370,
69*4882a593Smuzhiyun     MT5931,
70*4882a593Smuzhiyun     RDA587x,
71*4882a593Smuzhiyun     RDA5990,
72*4882a593Smuzhiyun     RTK8723AS,
73*4882a593Smuzhiyun     RTK8723BS,
74*4882a593Smuzhiyun     RTK8723AU,
75*4882a593Smuzhiyun     RTK8723BU,
76*4882a593Smuzhiyun     BK3515,
77*4882a593Smuzhiyun     SOFIA_3GR,
78*4882a593Smuzhiyun };
79*4882a593Smuzhiyun 
80*4882a593Smuzhiyun static int rfkill_bt_id = -1;
81*4882a593Smuzhiyun static char rfkill_state_path[128];
82*4882a593Smuzhiyun static int bluetooth_power_status = 0;
83*4882a593Smuzhiyun static int chip_type;
84*4882a593Smuzhiyun 
85*4882a593Smuzhiyun //* 1����ʼ��rfkill����ȡBluetooth��Ӧid
init_rfkill()86*4882a593Smuzhiyun static int init_rfkill() {
87*4882a593Smuzhiyun     char path[64];
88*4882a593Smuzhiyun     char buf[16];
89*4882a593Smuzhiyun     int fd;
90*4882a593Smuzhiyun     int length_r;
91*4882a593Smuzhiyun     int id;
92*4882a593Smuzhiyun     printf("======================init rfkill start==================\n\n");
93*4882a593Smuzhiyun     for (id = 0; ; id++) {
94*4882a593Smuzhiyun         sprintf(path, "/sys/class/rfkill/rfkill%d/type", id);
95*4882a593Smuzhiyun         fd = open(path, O_RDONLY);
96*4882a593Smuzhiyun         if (fd < 0) {
97*4882a593Smuzhiyun             printf("open(%s) failed: %s (%d)\n", path, strerror(errno), errno);
98*4882a593Smuzhiyun             printf("======================init rfkill failed==================\n\n");
99*4882a593Smuzhiyun             return -1;
100*4882a593Smuzhiyun         }
101*4882a593Smuzhiyun         length_r = read(fd, &buf, sizeof(buf));
102*4882a593Smuzhiyun         close(fd);
103*4882a593Smuzhiyun         if (length_r >= 9 && memcmp(buf, "bluetooth", 9) == 0) {
104*4882a593Smuzhiyun             rfkill_bt_id = id;
105*4882a593Smuzhiyun             break;
106*4882a593Smuzhiyun         }
107*4882a593Smuzhiyun     }
108*4882a593Smuzhiyun     printf("\t Bluetooth initialize id is :%d\n",rfkill_bt_id);
109*4882a593Smuzhiyun     sprintf(rfkill_state_path, "/sys/class/rfkill/rfkill%d/state", rfkill_bt_id);
110*4882a593Smuzhiyun     printf("======================init rfkill success==================\n\n");
111*4882a593Smuzhiyun     return 0;
112*4882a593Smuzhiyun }
113*4882a593Smuzhiyun 
114*4882a593Smuzhiyun //* 2����ȡBluetoothоƬ����
bt_get_chip_name(char * name,int len)115*4882a593Smuzhiyun int bt_get_chip_name(char* name, int len)
116*4882a593Smuzhiyun {
117*4882a593Smuzhiyun     int fd = -1;
118*4882a593Smuzhiyun     int length_r = 0;
119*4882a593Smuzhiyun     char rfkill_name_path[128];
120*4882a593Smuzhiyun     int ret = -1;
121*4882a593Smuzhiyun 
122*4882a593Smuzhiyun     printf("================bt_get_chip_name start================\n\n");
123*4882a593Smuzhiyun     sprintf(rfkill_name_path, "/sys/class/rfkill/rfkill%d/name", rfkill_bt_id);
124*4882a593Smuzhiyun     fd = open(rfkill_name_path, O_RDONLY|O_NOCTTY|O_NDELAY,0);
125*4882a593Smuzhiyun     if (fd < 0) {
126*4882a593Smuzhiyun         printf("open(%s) failed: %s (%d)", rfkill_name_path, strerror(errno),errno);
127*4882a593Smuzhiyun         goto out;
128*4882a593Smuzhiyun     }
129*4882a593Smuzhiyun 
130*4882a593Smuzhiyun     length_r = read(fd, name, len);
131*4882a593Smuzhiyun     if (length_r < 0) {
132*4882a593Smuzhiyun         printf("read(%s) failed: %s (%d)", rfkill_name_path, strerror(errno),errno);
133*4882a593Smuzhiyun         goto out;
134*4882a593Smuzhiyun     }
135*4882a593Smuzhiyun     name[length_r-1] = '\0';
136*4882a593Smuzhiyun     close(fd);
137*4882a593Smuzhiyun     printf("================bt_get_chip_name success================\n");
138*4882a593Smuzhiyun     return 0;
139*4882a593Smuzhiyun out:
140*4882a593Smuzhiyun     if (fd >= 0) close(fd);
141*4882a593Smuzhiyun     printf("================bt_get_chip_name failed================\n");
142*4882a593Smuzhiyun     return -1;
143*4882a593Smuzhiyun }
144*4882a593Smuzhiyun 
145*4882a593Smuzhiyun //* 3����ȡоƬ����
get_chip_type(char * bt_chip_name)146*4882a593Smuzhiyun static int get_chip_type(char *bt_chip_name)
147*4882a593Smuzhiyun 
148*4882a593Smuzhiyun {
149*4882a593Smuzhiyun     int chip_type;
150*4882a593Smuzhiyun     char chip_type_name[64];
151*4882a593Smuzhiyun     memset(chip_type_name,0,sizeof(chip_type_name));
152*4882a593Smuzhiyun     printf("================bluetooth get_chip_type start================\n\n");
153*4882a593Smuzhiyun     if(!memcmp(bt_chip_name, "rk903",strlen("rk903"))) {
154*4882a593Smuzhiyun 		chip_type = RK903;
155*4882a593Smuzhiyun 		memcpy(chip_type_name,"RK903",strlen("RK903"));
156*4882a593Smuzhiyun 	} else if(!memcmp(bt_chip_name, "mt6622",strlen("mt6622"))) {
157*4882a593Smuzhiyun 		chip_type = MT5931;
158*4882a593Smuzhiyun 		memcpy(chip_type_name,"MT5931",strlen("MT5931"));
159*4882a593Smuzhiyun 	} else if(!memcmp(bt_chip_name, "rda587x",strlen("rda587x"))) {
160*4882a593Smuzhiyun 		chip_type = RDA587x;
161*4882a593Smuzhiyun 		memcpy(chip_type_name,"RDA587x",strlen("RDA587x"));
162*4882a593Smuzhiyun 	} else if(!memcmp(bt_chip_name, "rda5990",strlen("rda5990"))) {
163*4882a593Smuzhiyun 		chip_type = RDA5990;
164*4882a593Smuzhiyun 		memcpy(chip_type_name,"RDA5990",strlen("RDA5990"));
165*4882a593Smuzhiyun 	} else if(!memcmp(bt_chip_name, "rtk8723as",strlen("rtk8723as"))) {
166*4882a593Smuzhiyun 		chip_type = RTK8723AS;
167*4882a593Smuzhiyun 		memcpy(chip_type_name,"RTK8723AS",strlen("RTK8723AS"));
168*4882a593Smuzhiyun 	} else if(!memcmp(bt_chip_name, "rtk8723bs",strlen("rtk8723bs"))) {
169*4882a593Smuzhiyun 		chip_type = RTK8723BS;
170*4882a593Smuzhiyun 		memcpy(chip_type_name,"RTK8723BS",strlen("RTK8723BS"));
171*4882a593Smuzhiyun 	} else if(!memcmp(bt_chip_name, "rtk8723au",strlen("rtk8723au"))) {
172*4882a593Smuzhiyun 		chip_type = RTK8723AU;
173*4882a593Smuzhiyun 		memcpy(chip_type_name,"RTK8723AU",strlen("RTK8723AU"));
174*4882a593Smuzhiyun 	} else if(!memcmp(bt_chip_name, "rtk8723bu",strlen("rtk8723bu"))) {
175*4882a593Smuzhiyun 		chip_type = RTK8723BU;
176*4882a593Smuzhiyun 		memcpy(chip_type_name,"RTK8723BU",strlen("RTK8723BU"));
177*4882a593Smuzhiyun     } else if(!memcmp(bt_chip_name, "bk3515",strlen("bk3515"))) {
178*4882a593Smuzhiyun         chip_type = BK3515;
179*4882a593Smuzhiyun         memcpy(chip_type_name,"BK3515",strlen("BK3515"));
180*4882a593Smuzhiyun 	} else if(!memcmp(bt_chip_name, "Sofia-3gr",strlen("Sofia-3gr"))){
181*4882a593Smuzhiyun         chip_type = SOFIA_3GR;
182*4882a593Smuzhiyun         memcpy(chip_type_name,"SOFIA_3GR",strlen("SOFIA_3GR"));
183*4882a593Smuzhiyun 	}
184*4882a593Smuzhiyun     else if (!memcmp(bt_chip_name, "rk903_26M",strlen("rk903_26M"))){
185*4882a593Smuzhiyun         chip_type = RK903;
186*4882a593Smuzhiyun         memcpy(chip_type_name,"RK903",strlen("RK903"));
187*4882a593Smuzhiyun     }
188*4882a593Smuzhiyun     else if (!memcmp(bt_chip_name, "rk903",strlen("rk903")))
189*4882a593Smuzhiyun         {
190*4882a593Smuzhiyun         chip_type = RK903;
191*4882a593Smuzhiyun         memcpy(chip_type_name,"RK903",strlen("RK903"));
192*4882a593Smuzhiyun     }
193*4882a593Smuzhiyun     else if (!memcmp(bt_chip_name, "ap6210",strlen("ap6210"))){
194*4882a593Smuzhiyun         chip_type = RK903;
195*4882a593Smuzhiyun         memcpy(chip_type_name,"RK903",strlen("RK903"));
196*4882a593Smuzhiyun     }
197*4882a593Smuzhiyun     else if (!memcmp(bt_chip_name, "ap6335",strlen("ap6330"))){
198*4882a593Smuzhiyun         chip_type = RK903;
199*4882a593Smuzhiyun         memcpy(chip_type_name,"RK903",strlen("RK903"));
200*4882a593Smuzhiyun     }
201*4882a593Smuzhiyun     else if (!memcmp(bt_chip_name, "ap6476",strlen("ap6476"))){
202*4882a593Smuzhiyun         chip_type = RK903;
203*4882a593Smuzhiyun         memcpy(chip_type_name,"RK903",strlen("RK903"));
204*4882a593Smuzhiyun     }
205*4882a593Smuzhiyun     else if (!memcmp(bt_chip_name, "ap6493",strlen("ap6493"))){
206*4882a593Smuzhiyun         chip_type = RK903;
207*4882a593Smuzhiyun         memcpy(chip_type_name,"RK903",strlen("RK903"));
208*4882a593Smuzhiyun     }
209*4882a593Smuzhiyun     else {
210*4882a593Smuzhiyun         printf("Not support BT chip, skip bt test.\n");
211*4882a593Smuzhiyun         chip_type = BT_UNKNOWN;
212*4882a593Smuzhiyun         memcpy(chip_type_name,"BT_UNKNOWN",strlen("BT_UNKNOWN"));
213*4882a593Smuzhiyun     }
214*4882a593Smuzhiyun     printf("chip type is: %s\n", chip_type_name);
215*4882a593Smuzhiyun     printf("================bluetooth get_chip_type finish================\n");
216*4882a593Smuzhiyun     return chip_type;
217*4882a593Smuzhiyun }
218*4882a593Smuzhiyun 
219*4882a593Smuzhiyun //* 4->1���رպ�̨brcm_patchram_plus1����
close_brcm_pathcram_plus1(void)220*4882a593Smuzhiyun int close_brcm_pathcram_plus1(void)
221*4882a593Smuzhiyun {
222*4882a593Smuzhiyun     int test_flag = -1;
223*4882a593Smuzhiyun     char pid_buf[64];
224*4882a593Smuzhiyun     char cmd[64];
225*4882a593Smuzhiyun     FILE* pp;
226*4882a593Smuzhiyun     printf("====================function : %s start =================\n",__func__);
227*4882a593Smuzhiyun     pp = popen("ps |grep brcm_patchram_plus1|awk 'NR==1 {print $1}'","r");
228*4882a593Smuzhiyun     //����ļ���ʧ�ܣ������������Ϣ
229*4882a593Smuzhiyun     if (!pp)
230*4882a593Smuzhiyun     {
231*4882a593Smuzhiyun         printf("%s popen err%s\n",__func__,strerror(errno));
232*4882a593Smuzhiyun         return -1;
233*4882a593Smuzhiyun     }
234*4882a593Smuzhiyun     fgets(pid_buf,sizeof(pid_buf),pp);
235*4882a593Smuzhiyun     pclose(pp);
236*4882a593Smuzhiyun     printf("Get pid_buf is: \t %s\n",pid_buf);
237*4882a593Smuzhiyun     sprintf(cmd,"kill -9 %d",atoi(pid_buf));
238*4882a593Smuzhiyun     printf("cmd is: %s\n",cmd);
239*4882a593Smuzhiyun     system(cmd);
240*4882a593Smuzhiyun     printf("====================function : %s finish =================\n",__func__);
241*4882a593Smuzhiyun     return 0;
242*4882a593Smuzhiyun }
243*4882a593Smuzhiyun 
244*4882a593Smuzhiyun //* 4->2->1����ȡhci0��������ַ,ȷ�Ϲ̼��Ƿ���سɹ����ɹ��õ�������ַ��ʧ������������ַ
get_bdaddr_test(void)245*4882a593Smuzhiyun int get_bdaddr_test(void)
246*4882a593Smuzhiyun {
247*4882a593Smuzhiyun     int test_flag =-1;
248*4882a593Smuzhiyun     char bdaddr[64];
249*4882a593Smuzhiyun     char cmd[64];
250*4882a593Smuzhiyun     int count =0;
251*4882a593Smuzhiyun     printf("*******************function:%s start******************\n",__func__);
252*4882a593Smuzhiyun     FILE* pp = popen("hciconfig -a| grep \"BD Address:\"|awk '{print $3}'","r");
253*4882a593Smuzhiyun     //����ļ���ʧ�ܣ������������Ϣ
254*4882a593Smuzhiyun     if (!pp)
255*4882a593Smuzhiyun     {
256*4882a593Smuzhiyun         printf("%s popen err%s\n",__func__,strerror(errno));
257*4882a593Smuzhiyun         return -1;
258*4882a593Smuzhiyun     }
259*4882a593Smuzhiyun     memset(bdaddr,0,sizeof(bdaddr));
260*4882a593Smuzhiyun     fscanf(pp,"%s",bdaddr);
261*4882a593Smuzhiyun     pclose(pp);
262*4882a593Smuzhiyun     if(bdaddr[0]!='\0')
263*4882a593Smuzhiyun     {
264*4882a593Smuzhiyun        printf("Get bluetooth device address is: \t  %s\n",bdaddr);
265*4882a593Smuzhiyun        test_flag = 0;
266*4882a593Smuzhiyun     }
267*4882a593Smuzhiyun     else
268*4882a593Smuzhiyun     {
269*4882a593Smuzhiyun         //printf("Failed to load bluetooth firmware.\n");
270*4882a593Smuzhiyun         printf("loadind bluetooth firmware.....\n");
271*4882a593Smuzhiyun         test_flag = -1;
272*4882a593Smuzhiyun     }
273*4882a593Smuzhiyun     if(!memcmp(bdaddr,BT_INIT_ADDR,strlen(BT_INIT_ADDR)))
274*4882a593Smuzhiyun     {
275*4882a593Smuzhiyun         printf("hci0 interface create failed\n");
276*4882a593Smuzhiyun         test_flag = -1;
277*4882a593Smuzhiyun     }
278*4882a593Smuzhiyun     printf("*******************function:%s finish******************\n",__func__);
279*4882a593Smuzhiyun     return test_flag;
280*4882a593Smuzhiyun }
281*4882a593Smuzhiyun 
282*4882a593Smuzhiyun //* 4->2->2��ѭ����ȡhci0��������ַ,ȷ�Ϲ̼��Ƿ���سɹ��������30s�ڻ�ȡ������ַ���̼����سɹ�������ʧ��
confirm_firmware_test(void)283*4882a593Smuzhiyun static int confirm_firmware_test(void)
284*4882a593Smuzhiyun {
285*4882a593Smuzhiyun     int period = PERIOD_TIME;
286*4882a593Smuzhiyun     int time_out = 0;
287*4882a593Smuzhiyun     int test_flag = 0;
288*4882a593Smuzhiyun 
289*4882a593Smuzhiyun     printf("*******************function:%s start******************\n",__func__);
290*4882a593Smuzhiyun     while(time_out < BT_TIMEOUT_FIRMWARE)
291*4882a593Smuzhiyun     {
292*4882a593Smuzhiyun 
293*4882a593Smuzhiyun         //ÿ���̶�ʱ���ȡһ��������ַ
294*4882a593Smuzhiyun         sleep(period);
295*4882a593Smuzhiyun         if(!get_bdaddr_test()){
296*4882a593Smuzhiyun                 break;
297*4882a593Smuzhiyun         }
298*4882a593Smuzhiyun         time_out +=PERIOD_TIME;
299*4882a593Smuzhiyun     }
300*4882a593Smuzhiyun     if(time_out > BT_TIMEOUT_FIRMWARE)
301*4882a593Smuzhiyun     {
302*4882a593Smuzhiyun         printf("Failed to load bluetooth firmware.\n");
303*4882a593Smuzhiyun         test_flag = -1;
304*4882a593Smuzhiyun     }
305*4882a593Smuzhiyun     printf("*******************function:%s finish******************\n",__func__);
306*4882a593Smuzhiyun     return test_flag;
307*4882a593Smuzhiyun }
308*4882a593Smuzhiyun 
309*4882a593Smuzhiyun //* 4->3��ʹ��hciconfig hci0 up ����������Ȼ��ʹ��hcitool dev�鿴�Ƿ���
activate_bt_test(void)310*4882a593Smuzhiyun int activate_bt_test(void)
311*4882a593Smuzhiyun {
312*4882a593Smuzhiyun     int test_flag = -1;
313*4882a593Smuzhiyun     char bdaddr[64];
314*4882a593Smuzhiyun     char cmd[64];
315*4882a593Smuzhiyun     FILE* pp = NULL;
316*4882a593Smuzhiyun 
317*4882a593Smuzhiyun     printf("*******************function:%s start******************\n",__func__);
318*4882a593Smuzhiyun     system("hciconfig hci0 up");
319*4882a593Smuzhiyun     pp = popen("hcitool dev|grep hci0|awk '{print $2}'","r");
320*4882a593Smuzhiyun     //����ļ���ʧ�ܣ������������Ϣ
321*4882a593Smuzhiyun     if (!pp)
322*4882a593Smuzhiyun     {
323*4882a593Smuzhiyun         printf("%s popen err%s\n",__func__,strerror(errno));
324*4882a593Smuzhiyun         return -1;
325*4882a593Smuzhiyun     }
326*4882a593Smuzhiyun     memset(bdaddr,0,sizeof(bdaddr));
327*4882a593Smuzhiyun     fscanf(pp,"%s",bdaddr);
328*4882a593Smuzhiyun     pclose(pp);
329*4882a593Smuzhiyun     if(bdaddr[0]!='\0')
330*4882a593Smuzhiyun     {
331*4882a593Smuzhiyun         printf("Get bluetooth device address is :\t  %s\n",bdaddr);
332*4882a593Smuzhiyun         test_flag = 0;
333*4882a593Smuzhiyun     }
334*4882a593Smuzhiyun     else{
335*4882a593Smuzhiyun         printf("hci0 activates failed.\n");
336*4882a593Smuzhiyun         test_flag = -1;
337*4882a593Smuzhiyun     }
338*4882a593Smuzhiyun     printf("*******************function:%s finish******************\n",__func__);
339*4882a593Smuzhiyun     return test_flag;
340*4882a593Smuzhiyun }
341*4882a593Smuzhiyun 
342*4882a593Smuzhiyun //* 4->4��ɨ����Χ�������豸����ȡԶ�������豸��ַ,����ɨ��õ���Զ���豸����
bt_scan_test(void)343*4882a593Smuzhiyun int bt_scan_test(void)
344*4882a593Smuzhiyun {
345*4882a593Smuzhiyun     int test_flag = -1;
346*4882a593Smuzhiyun     char bdaddr[64];
347*4882a593Smuzhiyun     char cmd[64];
348*4882a593Smuzhiyun     int count =0;
349*4882a593Smuzhiyun     FILE* pp;
350*4882a593Smuzhiyun     printf("--------------------function: %s start-------------------\n",__func__);
351*4882a593Smuzhiyun     pp = popen("hcitool scan |awk 'NR>=2{print $1}'","r");
352*4882a593Smuzhiyun     //����ļ���ʧ�ܣ������������Ϣ
353*4882a593Smuzhiyun     if (!pp)
354*4882a593Smuzhiyun     {
355*4882a593Smuzhiyun         printf("%s popen err%s\n",__func__,strerror(errno));
356*4882a593Smuzhiyun         return -1;
357*4882a593Smuzhiyun     }
358*4882a593Smuzhiyun     while(!feof(pp))
359*4882a593Smuzhiyun     {
360*4882a593Smuzhiyun         memset(bdaddr,0,sizeof(bdaddr));
361*4882a593Smuzhiyun         fscanf(pp,"%s",bdaddr);
362*4882a593Smuzhiyun         if((bdaddr[0]!='\0'))
363*4882a593Smuzhiyun         {
364*4882a593Smuzhiyun             printf("Get remote Bluetooth device address is : \t  %s\n",bdaddr);
365*4882a593Smuzhiyun             count++;
366*4882a593Smuzhiyun         }
367*4882a593Smuzhiyun         else if(!count)
368*4882a593Smuzhiyun         {
369*4882a593Smuzhiyun             printf("Failed to scan remote bluetooth.\n");
370*4882a593Smuzhiyun             return -1;
371*4882a593Smuzhiyun         }
372*4882a593Smuzhiyun     }
373*4882a593Smuzhiyun     pclose(pp);
374*4882a593Smuzhiyun     printf("--------------------function: %s success-------------------\n",__func__);
375*4882a593Smuzhiyun     return count;
376*4882a593Smuzhiyun }
377*4882a593Smuzhiyun 
378*4882a593Smuzhiyun 
379*4882a593Smuzhiyun //* 4����������������
bt_test_bluez(void)380*4882a593Smuzhiyun int bt_test_bluez(void)
381*4882a593Smuzhiyun {
382*4882a593Smuzhiyun     int test_flag = -1;
383*4882a593Smuzhiyun     char cmd[128];
384*4882a593Smuzhiyun     int dev_cnt = 0;
385*4882a593Smuzhiyun     int status;
386*4882a593Smuzhiyun     //* 1) �ر����������ȹرպ�̨brcm_patchram_plus1���̣�Ȼ��������µ�
387*4882a593Smuzhiyun     test_flag = close_brcm_pathcram_plus1();
388*4882a593Smuzhiyun     if(test_flag<0)
389*4882a593Smuzhiyun         goto out;
390*4882a593Smuzhiyun     sprintf(cmd,"echo 0 > %s",rfkill_state_path);
391*4882a593Smuzhiyun     system(cmd);
392*4882a593Smuzhiyun 
393*4882a593Smuzhiyun 
394*4882a593Smuzhiyun     //* 2) ȷ�������رպ����¸������ϵ磬���ع̼�
395*4882a593Smuzhiyun     sprintf(cmd,"echo 1 > %s",rfkill_state_path);
396*4882a593Smuzhiyun     system(cmd);
397*4882a593Smuzhiyun     //status = system("brcm_patchram_plus1 --enable_hci --no2bytes \
398*4882a593Smuzhiyun     //       --use_baudrate_for_download  --tosleep  200000 \
399*4882a593Smuzhiyun     //       --baudrate 1500000 --patchram /data/bcm4339a0.hcd /dev/ttyS1 &");
400*4882a593Smuzhiyun #ifdef PCBA_3308
401*4882a593Smuzhiyun     status = system("brcm_patchram_plus1 --enable_hci --no2bytes \
402*4882a593Smuzhiyun            --use_baudrate_for_download  --tosleep  200000 \
403*4882a593Smuzhiyun            --baudrate 1500000 --patchram /system/etc/firmware/BCM4345C0.hcd /dev/ttyS4 &");
404*4882a593Smuzhiyun #endif
405*4882a593Smuzhiyun 
406*4882a593Smuzhiyun #ifdef PCBA_PX3SE
407*4882a593Smuzhiyun     status = system("rtlbt  -n -s 115200 /dev/ttyS1 rtk_h5 > /data/cfg/hciattach.txt  2>&1 &");
408*4882a593Smuzhiyun #endif
409*4882a593Smuzhiyun #ifdef PCBA_3229GVA
410*4882a593Smuzhiyun     status = system("brcm_patchram_plus1 --enable_hci --no2bytes \
411*4882a593Smuzhiyun            --use_baudrate_for_download  --tosleep  200000 \
412*4882a593Smuzhiyun            --baudrate 1500000 --patchram /data/bcm4339a0.hcd /dev/ttyS1 &");
413*4882a593Smuzhiyun #endif
414*4882a593Smuzhiyun     test_flag = confirm_firmware_test();
415*4882a593Smuzhiyun     if(test_flag < 0)
416*4882a593Smuzhiyun         goto out;
417*4882a593Smuzhiyun 
418*4882a593Smuzhiyun     //* 3) ����������Ȼ��ʹ��hcitool dev�鿴�Ƿ���
419*4882a593Smuzhiyun     system("hciconfig hci0 up");
420*4882a593Smuzhiyun     test_flag = activate_bt_test();
421*4882a593Smuzhiyun     if(test_flag < 0)
422*4882a593Smuzhiyun         goto out;
423*4882a593Smuzhiyun 
424*4882a593Smuzhiyun     //* 4) ɨ����Χ�������豸,��ӡ���豸��ַ
425*4882a593Smuzhiyun //    dev_cnt = bt_scan_test();
426*4882a593Smuzhiyun //    if(dev_cnt < 0)
427*4882a593Smuzhiyun //        goto out;
428*4882a593Smuzhiyun     printf("Get remote Bluetooth device number is: %d\n",dev_cnt);
429*4882a593Smuzhiyun     printf("==============function: %s success ================\n",__func__);
430*4882a593Smuzhiyun     return 0;
431*4882a593Smuzhiyun out:
432*4882a593Smuzhiyun     printf("==============function: %s failed ================\n",__func__);
433*4882a593Smuzhiyun     return -1;
434*4882a593Smuzhiyun }
435*4882a593Smuzhiyun 
436*4882a593Smuzhiyun //* Bluetooth test function
bt_test(void * argv)437*4882a593Smuzhiyun void *bt_test(void *argv)
438*4882a593Smuzhiyun {
439*4882a593Smuzhiyun     int bt_init_result,bt_setPower_result;
440*4882a593Smuzhiyun     char cmd[64];
441*4882a593Smuzhiyun     char bt_chip_name[64];
442*4882a593Smuzhiyun     int bt_chip_type;
443*4882a593Smuzhiyun     int ret = -1;
444*4882a593Smuzhiyun     printf("======================Bluetooth test start================\n\n");
445*4882a593Smuzhiyun     //sprintf(cmd,"aplay %s/bt_test_start.wav",AUDIO_PATH);
446*4882a593Smuzhiyun     //system(cmd);
447*4882a593Smuzhiyun     //system("aplay /data/cfg/test/bt_test_start.wav");
448*4882a593Smuzhiyun     //1����ʼ��rfkill����ȡBluetooth��Ӧid
449*4882a593Smuzhiyun     ret = init_rfkill();
450*4882a593Smuzhiyun     if(ret < 0){
451*4882a593Smuzhiyun 		printf("function: %s failed! %s\n",__func__,strerror(errno));
452*4882a593Smuzhiyun 		goto fail;
453*4882a593Smuzhiyun 	}
454*4882a593Smuzhiyun     printf("Bluetooth is /sys/class/rfkill/rfkill:%d\n",rfkill_bt_id);
455*4882a593Smuzhiyun 
456*4882a593Smuzhiyun     //2����ȡBluetoothоƬ���֣�chip name
457*4882a593Smuzhiyun     ret = bt_get_chip_name(bt_chip_name,sizeof(bt_chip_name));
458*4882a593Smuzhiyun     if(ret < 0){
459*4882a593Smuzhiyun 		printf("function: %s failed! %s\n",__func__,strerror(errno));
460*4882a593Smuzhiyun 		goto fail;
461*4882a593Smuzhiyun 	}
462*4882a593Smuzhiyun 	printf("Bluetooth chip name is %s\n",bt_chip_name);
463*4882a593Smuzhiyun 
464*4882a593Smuzhiyun     //3����ȡоƬ���͡�chip type
465*4882a593Smuzhiyun     bt_chip_type = get_chip_type(bt_chip_name);
466*4882a593Smuzhiyun     if(bt_chip_type < 0){
467*4882a593Smuzhiyun 		printf("function: %s failed! %s\n",__func__,strerror(errno));
468*4882a593Smuzhiyun 		goto fail;
469*4882a593Smuzhiyun 	}
470*4882a593Smuzhiyun     printf("Bluetooth chip type is: bt_chip_type = %d\n", bt_chip_type);
471*4882a593Smuzhiyun 
472*4882a593Smuzhiyun     //4������Bluetooth������
473*4882a593Smuzhiyun      ret = bt_test_bluez();
474*4882a593Smuzhiyun      if(ret < 0){
475*4882a593Smuzhiyun         printf("bluetooth_test main function: %s failed.\n",__func__);
476*4882a593Smuzhiyun 		goto fail;
477*4882a593Smuzhiyun      }
478*4882a593Smuzhiyun     printf("======================Bluetooth test success================\n");
479*4882a593Smuzhiyun     system("busybox killall brcm_patchram_plus1");      //�رչ̼����س���
480*4882a593Smuzhiyun     return (void*)ret;
481*4882a593Smuzhiyun fail:
482*4882a593Smuzhiyun     printf("======================Bluetooth test failed================\n");
483*4882a593Smuzhiyun     system("busybox killall brcm_patchram_plus1");      //�رչ̼����س���
484*4882a593Smuzhiyun     return (void*)ret;
485*4882a593Smuzhiyun }
486*4882a593Smuzhiyun 
487*4882a593Smuzhiyun //*���������
main(int argc,char * argv[])488*4882a593Smuzhiyun int main(int argc, char *argv[])
489*4882a593Smuzhiyun {
490*4882a593Smuzhiyun     int test_flag = 0,err_code = 0;
491*4882a593Smuzhiyun     char buf[COMMAND_VALUESIZE] = "bt_test";
492*4882a593Smuzhiyun     char result[COMMAND_VALUESIZE] = RESULT_PASS;
493*4882a593Smuzhiyun     test_flag = (int)bt_test(argv[0]);
494*4882a593Smuzhiyun     if(test_flag < 0)
495*4882a593Smuzhiyun     {
496*4882a593Smuzhiyun         strcpy(result,RESULT_FAIL);
497*4882a593Smuzhiyun         err_code = BT_PROC_ERR;
498*4882a593Smuzhiyun         printf("===err_code = %d===\n",err_code);
499*4882a593Smuzhiyun     }
500*4882a593Smuzhiyun     if (err_code != 0)
501*4882a593Smuzhiyun         strcpy(result, RESULT_FAIL);
502*4882a593Smuzhiyun     send_msg_to_server(buf, result, err_code);
503*4882a593Smuzhiyun }
504*4882a593Smuzhiyun 
505*4882a593Smuzhiyun 
506