1 #include <linux/kernel.h>
15 #include <sys/param.h>
16 #include <sys/ioctl.h>
17 #include <sys/socket.h>
20 #include <sys/types.h>
23 #include <bluetooth/bluetooth.h>
24 #include <bluetooth/hci.h>
25 #include <bluetooth/hci_lib.h>
27 #include "hciattach.h"
30 #include "hciattach_sprd.h"
32 //#include <android/log.h>
35 #define LOGD(...) __android_log_print(ANDROID_LOG_DEBUG, "pskey_bt", __VA_ARGS__)
37 #define LOGD(fmt, arg...) fprintf(stderr, "%s:%d()" fmt "\n", __FILE__,__LINE__, ## arg)
39 typedef unsigned char UINT8;
41 #define UINT32_TO_STREAM(p, u32) {*(p)++ = (UINT8)(u32); *(p)++ = (UINT8)((u32) >> 8); *(p)++ = (UINT8)((u32) >> 16); *(p)++ = (UINT8)((u32) >> 24);}
42 #define UINT24_TO_STREAM(p, u24) {*(p)++ = (UINT8)(u24); *(p)++ = (UINT8)((u24) >> 8); *(p)++ = (UINT8)((u24) >> 16);}
43 #define UINT16_TO_STREAM(p, u16) {*(p)++ = (UINT8)(u16); *(p)++ = (UINT8)((u16) >> 8);}
44 #define UINT8_TO_STREAM(p, u8) {*(p)++ = (UINT8)(u8);}
45 #define INT8_TO_STREAM(p, u8) {*(p)++ = (INT8)(u8);}
47 #define PSKEY_PRELOAD_SIZE 0x04
48 #define PSKEY_PREAMBLE_SIZE 0xA2
51 #define BT_MAC_FILE_PATH "/csa/bluetooth/"
52 #define DATMISC_MAC_ADDR_PATH BT_MAC_FILE_PATH".bd_addr"
53 #define MAC_ADDR_BUF_LEN (strlen("FF:FF:FF:FF:FF:FF"))
54 #define MAC_ADDR_FILE_LEN 25
55 #define MAC_ADDR_LEN 6
57 #define BD_ADDR_LEN 14
58 #define BD_PREFIX "0002\n"
61 #ifndef VENDOR_BTWRITE_PROC_NODE
62 #define VENDOR_BTWRITE_PROC_NODE "/proc/bluetooth/sleep/btwrite"
66 #define MAX_BT_TMP_PSKEY_FILE_LEN 2048
68 typedef unsigned int UWORD32;
69 typedef unsigned short UWORD16;
70 typedef unsigned char UWORD8;
72 #define down_bt_is_space(c) (((c) == '\n') || ((c) == ',') || ((c) == '\r') || ((c) == ' ') || ((c) == '{') || ((c) == '}'))
73 #define down_bt_is_comma(c) (((c) == ','))
74 #define down_bt_is_endc(c) (((c) == '}')) // indicate end of data
76 /* Macros to swap byte order */
77 #define SWAP_BYTE_ORDER_WORD(val) ((((val) & 0x000000FF) << 24) + \
78 (((val) & 0x0000FF00) << 8) + \
79 (((val) & 0x00FF0000) >> 8) + \
80 (((val) & 0xFF000000) >> 24))
81 #define INLINE static __inline
88 // pskey file structure default value
89 static BT_PSKEY_CONFIG_T bt_para_setting={
90 .pskey_cmd = 0x001C0101,
92 .g_dbg_source_sink_syn_test_data = 0,
93 .g_sys_sleep_in_standby_supported = 0,
94 .g_sys_sleep_master_supported = 0,
95 .g_sys_sleep_slave_supported = 0,
97 .default_ahb_clk = 26000000,
98 .device_class = 0x001F00,
101 .g_aGainValue = {0x0000F600, 0x0000D000, 0x0000AA00, 0x00008400, 0x00004400, 0x00000A00},
102 .g_aPowerValue = {0x0FC80000, 0x0FF80000, 0x0FDA0000, 0x0FCC0000, 0x0FFC0000},
104 .feature_set = {0xFF, 0xFF, 0x8D, 0xFE, 0x9B, 0x7F, 0x79, 0x83, 0xFF, 0xA7, 0xFF, 0x7F, 0x00, 0xE0, 0xF7, 0x3E},
105 .device_addr = {0x6A, 0x6B, 0x8C, 0x8A, 0x8B, 0x8C},
107 .g_sys_sco_transmit_mode = 0, //true tramsmit by uart, otherwise by share memory
108 .g_sys_uart0_communication_supported = 1, //true use uart0, otherwise use uart1 for debug
109 .edr_tx_edr_delay = 5,
110 .edr_rx_edr_delay = 14,
112 .g_wbs_nv_117 = 0x0031,
114 .is_wdg_supported = 0,
116 .share_memo_rx_base_addr = 0,
117 //.share_memo_tx_base_addr = 0,
118 .g_wbs_nv_118 = 0x0066,
119 .g_nbv_nv_117 = 0x1063,
121 .share_memo_tx_packet_num_addr = 0,
122 .share_memo_tx_data_base_addr = 0,
124 .g_PrintLevel = 0xFFFFFFFF,
126 .share_memo_tx_block_length = 0,
127 .share_memo_rx_block_length = 0,
128 .share_memo_tx_water_mark = 0,
129 //.share_memo_tx_timeout_value = 0,
130 .g_nbv_nv_118 = 0x0E45,
132 .uart_rx_watermark = 48,
133 .uart_flow_control_thld = 63,
135 .pcm_clk_divd = 0x26,
141 extern int getPskeyFromFile(void *pData);
142 extern int bt_getPskeyFromFile(void *pData);
144 static int create_mac_folder(void)
149 dp = opendir(BT_MAC_FILE_PATH);
151 if (mkdir(BT_MAC_FILE_PATH, 0755) < 0) {
153 LOGD("%s: mkdir: %s(%d)",__FUNCTION__, strerror(-err), -err);
162 static void mac_rand(char *btmac)
169 memcpy(btmac, BD_PREFIX, 5);
170 i = gettimeofday(&tv, NULL);
173 LOGD("Fail to call gettimeofday()");
176 seed = (unsigned int)tv.tv_usec;
178 for (i = 5; i < BD_ADDR_LEN; i++) {
183 ran = rand_r(&seed) % 16;
190 LOGD("Random number is\r\n");
191 for (i = 0; i < BD_ADDR_LEN; i++) {
192 LOGD("%c", btmac[i]);
197 static void write_btmac2file(char *btmac)
201 fd = open(DATMISC_MAC_ADDR_PATH, O_CREAT|O_RDWR|O_TRUNC, S_IRUSR|S_IWUSR);
202 LOGD("write_btmac2file open file, fd=%d", fd);
204 if(chmod(DATMISC_MAC_ADDR_PATH,0666) != -1){
205 ret = write(fd, btmac, strlen(btmac));
206 if (ret < strlen(btmac)) {
207 LOGD("Fail to write %s", DATMISC_MAC_ADDR_PATH);
214 LOGD("write bt mac to file failed!!");
218 uint8 ConvertHexToBin(
219 uint8 *hex_ptr, // in: the hexadecimal format string
220 uint16 length, // in: the length of hexadecimal string
221 uint8 *bin_ptr // out: pointer to the binary format string
223 uint8 *dest_ptr = bin_ptr;
227 for(i=0; i<length; i+=2){
231 if (ch >= '0' && ch <= '9')
232 *dest_ptr =(uint8)((ch - '0') << 4);
234 else if (ch >= 'a' && ch <= 'f')
235 *dest_ptr = (uint8)((ch - 'a' + 10) << 4);
237 else if (ch >= 'A' && ch <= 'F')
238 *dest_ptr = (uint8)((ch -'A' + 10) << 4);
246 if (ch >= '0' && ch <= '9')
247 *dest_ptr |= (uint8)(ch - '0');
249 else if (ch >= 'a' && ch <= 'f')
250 *dest_ptr |= (uint8)(ch - 'a' + 10);
252 else if (ch >= 'A' && ch <= 'F')
253 *dest_ptr |= (uint8)(ch -'A' + 10);
264 static int read_mac_address(char *file_name, uint8 *addr) {
265 char buf[MAC_ADDR_FILE_LEN] = {0};
266 uint32 addr_t[MAC_ADDR_LEN] = {0};
271 int fd = open(file_name, O_RDONLY, 0666);
272 LOGD("%s read file: %s", __func__, file_name);
274 LOGD("%s open %s error reason: %s", __func__, file_name, strerror(errno));
277 if (read(fd, buf, BD_ADDR_LEN) < 0) {
278 LOGD("%s read %s error reason: %s", __func__, file_name, strerror(errno));
281 if (sscanf(buf, "%02X%02X\n%02X\n%02X%02X%02X", &addr_t[0], &addr_t[1], &addr_t[2], &addr_t[3], &addr_t[4], &addr_t[5]) < 0) {
282 LOGD("%s sscanf %s error reason: %s", __func__, file_name, strerror(errno));
286 for (i = 0; i < MAC_ADDR_LEN; i++) {
287 addr[i] = addr_t[i] & 0xFF;
289 LOGD("%s %s addr: [%02X:%02X:%02X:%02X:%02X:%02X]", __func__, file_name, addr[0], addr[1], addr[2], addr[3], addr[4], addr[5]);
297 static void mac_address_stream_compose(uint8 *addr) {
299 for (i = 0, j = MAC_ADDR_LEN - 1; (i < MAC_ADDR_LEN / 2) && (i != j); i++, j--) {
308 * random bluetooth mac address
310 static void random_mac_addr(uint8 *addr) {
311 int fd, randseed, ret, mac_rd;
312 uint8 addr_t[MAC_ADDR_LEN] = {0};
314 LOGD("%s", __func__);
315 /* urandom seed build */
316 fd = open("/dev/urandom", O_RDONLY);
318 LOGD("%s: open urandom fail", __func__);
320 ret = read(fd, &randseed, sizeof(randseed));
321 LOGD("%s urandom:0x%08X", __func__, randseed);
325 /* time seed build */
326 if (fd < 0 || ret < 0) {
328 if (gettimeofday(&tt, (struct timezone *)0) > 0) {
329 randseed = (unsigned int) tt.tv_usec;
331 randseed = (unsigned int) time(NULL);
333 LOGD("urandom fail, using system time for randseed");
336 LOGD("%s: randseed = %u",__func__, randseed);
340 addr_t[0] = 0x40; /* FOR */
341 addr_t[1] = 0x45; /* SPRD */
342 addr_t[2] = 0xDA; /* ADDR */
343 addr_t[3] = (uint8)(mac_rd & 0xFF);
344 addr_t[4] = (uint8)((mac_rd >> 8) & 0xFF);
345 addr_t[5] = (uint8)((mac_rd >> 16) & 0xFF);
347 memcpy(addr, addr_t, MAC_ADDR_LEN);
348 LOGD("%s: MAC ADDR: [%02X:%02X:%02X:%02X:%02X:%02X]",__func__, addr_t[0], addr_t[1], addr_t[2], addr_t[3], addr_t[4], addr_t[5]);
351 static void get_mac_address(uint8 *addr){
353 uint8 addr_t[6] = {0};
354 char bt_mac[BD_ADDR_LEN] = {0, };
356 LOGD("%s", __func__);
357 /* check misc mac file exist */
358 ret = access(DATMISC_MAC_ADDR_PATH, F_OK);
360 LOGD("%s %s miss", __func__, DATMISC_MAC_ADDR_PATH);
362 /* Try to make bt address file */
366 LOGD("bt random mac=%s",bt_mac);
367 write_btmac2file(bt_mac);
372 read_mac_address(DATMISC_MAC_ADDR_PATH, addr_t);
374 /* compose mac stream */
375 mac_address_stream_compose(addr_t);
377 memcpy(addr, addr_t, MAC_ADDR_LEN);
383 * hci command preload stream, special order
385 static void pskey_stream_compose(uint8 * buf, BT_PSKEY_CONFIG_T *bt_par) {
389 LOGD("%s", __func__);
391 UINT24_TO_STREAM(p, bt_par->pskey_cmd);
392 UINT8_TO_STREAM(p, (uint8)(PSKEY_PREAMBLE_SIZE & 0xFF));
394 UINT8_TO_STREAM(p, bt_par->g_dbg_source_sink_syn_test_data);
395 UINT8_TO_STREAM(p, bt_par->g_sys_sleep_in_standby_supported);
396 UINT8_TO_STREAM(p, bt_par->g_sys_sleep_master_supported);
397 UINT8_TO_STREAM(p, bt_par->g_sys_sleep_slave_supported);
399 UINT32_TO_STREAM(p, bt_par->default_ahb_clk);
400 UINT32_TO_STREAM(p, bt_par->device_class);
401 UINT32_TO_STREAM(p, bt_par->win_ext);
403 for (i = 0; i < 6; i++) {
404 UINT32_TO_STREAM(p, bt_par->g_aGainValue[i]);
406 for (i = 0; i < 5; i++) {
407 UINT32_TO_STREAM(p, bt_par->g_aPowerValue[i]);
410 for (i = 0; i < 16; i++) {
411 UINT8_TO_STREAM(p, bt_par->feature_set[i]);
413 for (i = 0; i < 6; i++) {
414 UINT8_TO_STREAM(p, bt_par->device_addr[i]);
417 UINT8_TO_STREAM(p, bt_par->g_sys_sco_transmit_mode);
418 UINT8_TO_STREAM(p, bt_par->g_sys_uart0_communication_supported);
419 UINT8_TO_STREAM(p, bt_par->edr_tx_edr_delay);
420 UINT8_TO_STREAM(p, bt_par->edr_rx_edr_delay);
422 UINT16_TO_STREAM(p, bt_par->g_wbs_nv_117);
424 UINT32_TO_STREAM(p, bt_par->is_wdg_supported);
426 UINT32_TO_STREAM(p, bt_par->share_memo_rx_base_addr);
427 //UINT32_TO_STREAM(p, bt_par->share_memo_tx_base_addr);
428 UINT16_TO_STREAM(p, bt_par->g_wbs_nv_118);
429 UINT16_TO_STREAM(p, bt_par->g_nbv_nv_117);
431 UINT32_TO_STREAM(p, bt_par->share_memo_tx_packet_num_addr);
432 UINT32_TO_STREAM(p, bt_par->share_memo_tx_data_base_addr);
434 UINT32_TO_STREAM(p, bt_par->g_PrintLevel);
436 UINT16_TO_STREAM(p, bt_par->share_memo_tx_block_length);
437 UINT16_TO_STREAM(p, bt_par->share_memo_rx_block_length);
438 UINT16_TO_STREAM(p, bt_par->share_memo_tx_water_mark);
439 //UINT16_TO_STREAM(p, bt_par->share_memo_tx_timeout_value);
440 UINT16_TO_STREAM(p, bt_par->g_nbv_nv_118);
442 UINT16_TO_STREAM(p, bt_par->uart_rx_watermark);
443 UINT16_TO_STREAM(p, bt_par->uart_flow_control_thld);
444 UINT32_TO_STREAM(p, bt_par->comp_id);
445 UINT16_TO_STREAM(p, bt_par->pcm_clk_divd);
448 for (i = 0; i < 8; i++) {
449 UINT32_TO_STREAM(p, bt_par->reserved[i]);
453 void sprd_get_pskey(BT_PSKEY_CONFIG_T * pskey_t) {
454 BT_PSKEY_CONFIG_T pskey;
455 uint8 buf[180] = {0};
457 LOGD("%s", __func__);
458 memset(&pskey, 0 , sizeof(BT_PSKEY_CONFIG_T));
459 if (bt_getPskeyFromFile(&pskey) < 0 ) {
460 LOGD("%s bt_getPskeyFromFile failed", __func__);
461 memcpy(pskey_t, &bt_para_setting, sizeof(BT_PSKEY_CONFIG_T));
465 memset(buf, 0, PSKEY_PRELOAD_SIZE + PSKEY_PREAMBLE_SIZE);
467 /* get bluetooth mac address */
468 get_mac_address(pskey.device_addr);
470 /* compose pskey hci command pkt */
471 pskey_stream_compose(buf, &pskey);
473 memcpy(pskey_t, &pskey, sizeof(BT_PSKEY_CONFIG_T));
476 #define HCI_HDR_LEN 3
478 int sprd_config_init(int fd, char *bdaddr, struct termios *ti)
481 unsigned char resp[30] = {0};
482 BT_PSKEY_CONFIG_T bt_para_tmp;
483 uint8 data_tmp[30] = {'a'};
484 static int index = 0;
487 uint8 is_expected_hci_evt = 0;
490 int btsleep_fd_sprd = -1;
492 LOGD("sprd_config_init");
495 uart_fd = open(UART_INFO_PATH, O_WRONLY);
499 if (write(uart_fd, &buffer, 1) < 0)
501 LOGD("%s write(%s) failed: %s (%d) 2", __func__,
502 UART_INFO_PATH, strerror(errno),errno);
510 btsleep_fd_sprd = open(VENDOR_BTWRITE_PROC_NODE, O_WRONLY);
511 if (btsleep_fd_sprd < 0)
513 LOGD("%s open(%s) for write failed: %s (%d)", __func__,
514 VENDOR_BTWRITE_PROC_NODE, strerror(errno), errno);
519 if (write(btsleep_fd_sprd, &buffer, 1) < 0)
521 LOGD("%s write(%s) failed: %s (%d)", __func__,
522 VENDOR_BTWRITE_PROC_NODE, strerror(errno),errno);
527 ret = bt_getPskeyFromFile(&bt_para_tmp);
529 LOGD("init_sprd_config bt_getPskeyFromFile failed\n");
530 memcpy(&bt_para_tmp, &bt_para_setting, sizeof(BT_PSKEY_CONFIG_T));
533 buf = (uint8 *)malloc(PSKEY_PRELOAD_SIZE + PSKEY_PREAMBLE_SIZE);
535 LOGD("%s alloc stream memory failed", __func__);
538 memset(buf, 0, PSKEY_PRELOAD_SIZE + PSKEY_PREAMBLE_SIZE);
540 /* get bluetooth mac address */
541 get_mac_address(bt_para_tmp.device_addr);
543 /* compose pskey hci command pkt */
544 pskey_stream_compose(buf, &bt_para_tmp);
546 ret = write(fd, buf, PSKEY_PRELOAD_SIZE + PSKEY_PREAMBLE_SIZE);
547 LOGD("write pskey ret = %d", ret);
553 LOGD("%s write pskey stream failed", __func__);
557 memset(data_tmp, 0xff, sizeof(data_tmp));
559 r = read(fd, resp, 1);
564 data_tmp[index] = resp[0];
565 LOGD("recive from controller 0x%x", data_tmp[index]);
570 hci_len = data_tmp[2]+HCI_HDR_LEN;
572 if ((data_tmp[0] == 0x04) && (data_tmp[1] == 0xe) &&
573 (data_tmp[2] == 0xa) &&(data_tmp[3] == 0x1) &&
574 (data_tmp[4] == 0xa0) &&(data_tmp[5] == 0xfc)) {
575 LOGD("read response ok \n");
576 is_expected_hci_evt = 1;
578 LOGD("this is not what we expect HCI evt\n");
579 is_expected_hci_evt = 0;
582 if (index == hci_len) {
584 memset(data_tmp, 0x0, sizeof(data_tmp));
586 if(is_expected_hci_evt)