1 /* 2 * 3 * Copyright (c) 2013, The Linux Foundation. All rights reserved. 4 * Not a Contribution. 5 * 6 * Copyright 2012 The Android Open Source Project 7 * 8 * Licensed under the Apache License, Version 2.0 (the "License"); you 9 * may not use this file except in compliance with the License. You may 10 * obtain a copy of the License at 11 * 12 * http://www.apache.org/licenses/LICENSE-2.0 13 * 14 * Unless required by applicable law or agreed to in writing, software 15 * distributed under the License is distributed on an "AS IS" BASIS, 16 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or 17 * implied. See the License for the specific language governing 18 * permissions and limitations under the License. 19 * 20 */ 21 22 /****************************************************************************** 23 * 24 * Filename: hw_ar3k.c 25 * 26 * Description: Contains controller-specific functions, like 27 * firmware patch download 28 * low power mode operations 29 * 30 ******************************************************************************/ 31 #ifdef __cplusplus 32 extern "C" { 33 #endif 34 35 #define LOG_TAG "bt_vendor" 36 37 #include <sys/socket.h> 38 #include <utils/Log.h> 39 #include <sys/types.h> 40 #include <sys/stat.h> 41 #include <signal.h> 42 #include <time.h> 43 #include <errno.h> 44 #include <fcntl.h> 45 #include <dirent.h> 46 #include <ctype.h> 47 #include <cutils/properties.h> 48 #include <stdlib.h> 49 #include <string.h> 50 #include <termios.h> 51 52 #include "bt_hci_bdroid.h" 53 #include "hci_uart.h" 54 #include "hw_ar3k.h" 55 56 /****************************************************************************** 57 ** Variables 58 ******************************************************************************/ 59 int cbstat = 0; 60 #define PATCH_LOC_STRING_LEN 8 61 char ARbyte[3]; 62 char ARptr[MAX_PATCH_CMD + 1]; 63 int byte_cnt; 64 int patch_count = 0; 65 char patch_loc[PATCH_LOC_STRING_LEN + 1]; 66 int PSCounter=0; 67 68 uint32_t dev_type = 0; 69 uint32_t rom_version = 0; 70 uint32_t build_version = 0; 71 72 char patch_file[PATH_MAX]; 73 char ps_file[PATH_MAX]; 74 FILE *stream; 75 int tag_count=0; 76 77 /* for friendly debugging outpout string */ 78 static char *lpm_mode[] = { 79 "UNKNOWN", 80 "disabled", 81 "enabled" 82 }; 83 84 static char *lpm_state[] = { 85 "UNKNOWN", 86 "de-asserted", 87 "asserted" 88 }; 89 90 static uint8_t upio_state[UPIO_MAX_COUNT]; 91 struct ps_cfg_entry ps_list[MAX_TAGS]; 92 93 #define PS_EVENT_LEN 100 94 95 #ifdef __cplusplus 96 } 97 #endif 98 99 /***************************************************************************** 100 ** Functions 101 *****************************************************************************/ 102 103 int is_bt_soc_ath() { 104 int ret = 0; 105 char bt_soc_type[PROPERTY_VALUE_MAX]; 106 ret = property_get("qcom.bluetooth.soc", bt_soc_type, NULL); 107 if (ret != 0) { 108 ALOGI("qcom.bluetooth.soc set to %s\n", bt_soc_type); 109 if (!strncasecmp(bt_soc_type, "ath3k", sizeof("ath3k"))) 110 return 1; 111 } else { 112 ALOGI("qcom.bluetooth.soc not set, so using default.\n"); 113 } 114 115 return 0; 116 } 117 118 /* 119 * Send HCI command and wait for command complete event. 120 * The event buffer has to be freed by the caller. 121 */ 122 123 static int send_hci_cmd_sync(int dev, uint8_t *cmd, int len, uint8_t **event) 124 { 125 int err; 126 uint8_t *hci_event; 127 uint8_t pkt_type = HCI_COMMAND_PKT; 128 129 if (len == 0) 130 return len; 131 132 if (write(dev, &pkt_type, 1) != 1) 133 return -EILSEQ; 134 if (write(dev, (unsigned char *)cmd, len) != len) 135 return -EILSEQ; 136 137 hci_event = (uint8_t *)malloc(PS_EVENT_LEN); 138 if (!hci_event) 139 return -ENOMEM; 140 141 err = read_hci_event(dev, (unsigned char *)hci_event, PS_EVENT_LEN); 142 if (err > 0) { 143 *event = hci_event; 144 } else { 145 free(hci_event); 146 return -EILSEQ; 147 } 148 149 return len; 150 } 151 152 static void convert_bdaddr(char *str_bdaddr, char *bdaddr) 153 { 154 char bdbyte[3]; 155 char *str_byte = str_bdaddr; 156 int i, j; 157 int colon_present = 0; 158 159 if (strstr(str_bdaddr, ":")) 160 colon_present = 1; 161 162 bdbyte[2] = '\0'; 163 164 /* Reverse the BDADDR to LSB first */ 165 for (i = 0, j = 5; i < 6; i++, j--) { 166 bdbyte[0] = str_byte[0]; 167 bdbyte[1] = str_byte[1]; 168 bdaddr[j] = strtol(bdbyte, NULL, 16); 169 170 if (colon_present == 1) 171 str_byte += 3; 172 else 173 str_byte += 2; 174 } 175 } 176 177 static int uart_speed(int s) 178 { 179 switch (s) { 180 case 9600: 181 return B9600; 182 case 19200: 183 return B19200; 184 case 38400: 185 return B38400; 186 case 57600: 187 return B57600; 188 case 115200: 189 return B115200; 190 case 230400: 191 return B230400; 192 case 460800: 193 return B460800; 194 case 500000: 195 return B500000; 196 case 576000: 197 return B576000; 198 case 921600: 199 return B921600; 200 case 1000000: 201 return B1000000; 202 case 1152000: 203 return B1152000; 204 case 1500000: 205 return B1500000; 206 case 2000000: 207 return B2000000; 208 #ifdef B2500000 209 case 2500000: 210 return B2500000; 211 #endif 212 #ifdef B3000000 213 case 3000000: 214 return B3000000; 215 #endif 216 #ifdef B3500000 217 case 3500000: 218 return B3500000; 219 #endif 220 #ifdef B4000000 221 case 4000000: 222 return B4000000; 223 #endif 224 default: 225 return B57600; 226 } 227 } 228 229 int set_speed(int fd, struct termios *ti, int speed) 230 { 231 if (cfsetospeed(ti, uart_speed(speed)) < 0) 232 return -errno; 233 234 if (cfsetispeed(ti, uart_speed(speed)) < 0) 235 return -errno; 236 237 if (tcsetattr(fd, TCSANOW, ti) < 0) 238 return -errno; 239 240 return 0; 241 } 242 243 static void load_hci_ps_hdr(uint8_t *cmd, uint8_t ps_op, int len, int index) 244 { 245 hci_command_hdr *ch = (void *)cmd; 246 247 ch->opcode = htobs(cmd_opcode_pack(HCI_VENDOR_CMD_OGF, 248 HCI_PS_CMD_OCF)); 249 ch->plen = len + PS_HDR_LEN; 250 cmd += HCI_COMMAND_HDR_SIZE; 251 252 cmd[0] = ps_op; 253 cmd[1] = index; 254 cmd[2] = index >> 8; 255 cmd[3] = len; 256 } 257 258 259 static int read_ps_event(uint8_t *event, uint16_t ocf) 260 { 261 hci_event_hdr *eh; 262 uint16_t opcode = htobs(cmd_opcode_pack(HCI_VENDOR_CMD_OGF, ocf)); 263 264 event++; 265 266 eh = (void *)event; 267 event += HCI_EVENT_HDR_SIZE; 268 269 if (eh->evt == EVT_CMD_COMPLETE) { 270 evt_cmd_complete *cc = (void *)event; 271 272 event += EVT_CMD_COMPLETE_SIZE; 273 274 if (cc->opcode == opcode && event[0] == HCI_EV_SUCCESS) 275 return 0; 276 else 277 return -EILSEQ; 278 } 279 280 return -EILSEQ; 281 } 282 283 #define PS_WRITE 1 284 #define PS_RESET 2 285 #define WRITE_PATCH 8 286 #define ENABLE_PATCH 11 287 288 #define HCI_PS_CMD_HDR_LEN 7 289 290 static int write_cmd(int fd, uint8_t *buffer, int len) 291 { 292 uint8_t *event; 293 int err; 294 295 err = send_hci_cmd_sync(fd, buffer, len, &event); 296 if (err < 0) 297 return err; 298 299 err = read_ps_event(event, HCI_PS_CMD_OCF); 300 301 free(event); 302 303 return err; 304 } 305 306 #define PS_RESET_PARAM_LEN 6 307 #define PS_RESET_CMD_LEN (HCI_PS_CMD_HDR_LEN + PS_RESET_PARAM_LEN) 308 309 #define PS_ID_MASK 0xFF 310 311 /* Sends PS commands using vendor specficic HCI commands */ 312 static int write_ps_cmd(int fd, uint8_t opcode, uint32_t ps_param) 313 { 314 uint8_t cmd[HCI_MAX_CMD_SIZE]; 315 uint32_t i; 316 317 switch (opcode) { 318 case ENABLE_PATCH: 319 load_hci_ps_hdr(cmd, opcode, 0, 0x00); 320 321 if (write_cmd(fd, cmd, HCI_PS_CMD_HDR_LEN) < 0) 322 return -EILSEQ; 323 break; 324 325 case PS_RESET: 326 load_hci_ps_hdr(cmd, opcode, PS_RESET_PARAM_LEN, 0x00); 327 328 cmd[7] = 0x00; 329 cmd[PS_RESET_CMD_LEN - 2] = ps_param & PS_ID_MASK; 330 cmd[PS_RESET_CMD_LEN - 1] = (ps_param >> 8) & PS_ID_MASK; 331 332 if (write_cmd(fd, cmd, PS_RESET_CMD_LEN) < 0) 333 return -EILSEQ; 334 break; 335 336 case PS_WRITE: 337 for (i = 0; i < ps_param; i++) { 338 load_hci_ps_hdr(cmd, opcode, ps_list[i].len, 339 ps_list[i].id); 340 341 memcpy(&cmd[HCI_PS_CMD_HDR_LEN], ps_list[i].data, 342 ps_list[i].len); 343 344 if (write_cmd(fd, cmd, ps_list[i].len + 345 HCI_PS_CMD_HDR_LEN) < 0) 346 return -EILSEQ; 347 } 348 break; 349 } 350 351 return 0; 352 } 353 354 #define PS_ASIC_FILE "PS_ASIC.pst" 355 #define PS_FPGA_FILE "PS_FPGA.pst" 356 #define MAXPATHLEN 4096 357 static void get_ps_file_name(uint32_t devtype, uint32_t rom_version,char *path) 358 { 359 char *filename; 360 361 if (devtype == 0xdeadc0de) 362 filename = PS_ASIC_FILE; 363 else 364 filename = PS_FPGA_FILE; 365 366 snprintf(path, MAXPATHLEN, "%s%x/%s", FW_PATH, rom_version, filename); 367 } 368 369 #define PATCH_FILE "RamPatch.txt" 370 #define FPGA_ROM_VERSION 0x99999999 371 #define ROM_DEV_TYPE 0xdeadc0de 372 373 static void get_patch_file_name(uint32_t dev_type, uint32_t rom_version, 374 uint32_t build_version, char *path) 375 { 376 if (rom_version == FPGA_ROM_VERSION && dev_type != ROM_DEV_TYPE 377 &&dev_type != 0 && build_version == 1) 378 path[0] = '\0'; 379 else 380 snprintf(path, MAXPATHLEN, "%s%x/%s", FW_PATH, rom_version, PATCH_FILE); 381 } 382 383 static int set_cntrlr_baud(int fd, int speed) 384 { 385 int baud; 386 struct timespec tm = { 0, 500000}; 387 unsigned char cmd[MAX_CMD_LEN], rsp[HCI_MAX_EVENT_SIZE]; 388 unsigned char *ptr = cmd + 1; 389 hci_command_hdr *ch = (void *)ptr; 390 391 cmd[0] = HCI_COMMAND_PKT; 392 393 /* set controller baud rate to user specified value */ 394 ptr = cmd + 1; 395 ch->opcode = htobs(cmd_opcode_pack(HCI_VENDOR_CMD_OGF, 396 HCI_CHG_BAUD_CMD_OCF)); 397 ch->plen = 2; 398 ptr += HCI_COMMAND_HDR_SIZE; 399 400 baud = speed/100; 401 ptr[0] = (char)baud; 402 ptr[1] = (char)(baud >> 8); 403 404 if (write(fd, cmd, WRITE_BAUD_CMD_LEN) != WRITE_BAUD_CMD_LEN) { 405 ALOGI("Failed to write change baud rate command"); 406 return -ETIMEDOUT; 407 } 408 409 nanosleep(&tm, NULL); 410 411 if (read_hci_event(fd, rsp, sizeof(rsp)) < 0) 412 return -ETIMEDOUT; 413 414 return 0; 415 } 416 417 #define PS_UNDEF 0 418 #define PS_ID 1 419 #define PS_LEN 2 420 #define PS_DATA 3 421 422 #define PS_MAX_LEN 500 423 #define LINE_SIZE_MAX (PS_MAX_LEN * 2) 424 #define ENTRY_PER_LINE 16 425 426 #define __check_comment(buf) (((buf)[0] == '/') && ((buf)[1] == '/')) 427 #define __skip_space(str) while (*(str) == ' ') ((str)++) 428 429 430 #define __is_delim(ch) ((ch) == ':') 431 #define MAX_PREAMBLE_LEN 4 432 433 /* Parse PS entry preamble of format [X:X] for main type and subtype */ 434 static int get_ps_type(char *ptr, int index, char *type, char *sub_type) 435 { 436 int i; 437 int delim = FALSE; 438 439 if (index > MAX_PREAMBLE_LEN) 440 return -EILSEQ; 441 442 for (i = 1; i < index; i++) { 443 if (__is_delim(ptr[i])) { 444 delim = TRUE; 445 continue; 446 } 447 448 if (isalpha(ptr[i])) { 449 if (delim == FALSE) 450 (*type) = toupper(ptr[i]); 451 else 452 (*sub_type) = toupper(ptr[i]); 453 } 454 } 455 456 return 0; 457 } 458 459 #define ARRAY 'A' 460 #define STRING 'S' 461 #define DECIMAL 'D' 462 #define BINARY 'B' 463 464 #define PS_HEX 0 465 #define PS_DEC 1 466 467 static int get_input_format(char *buf, struct ps_entry_type *format) 468 { 469 char *ptr = NULL; 470 char type = '\0'; 471 char sub_type = '\0'; 472 473 format->type = PS_HEX; 474 format->array = TRUE; 475 476 if (strstr(buf, "[") != buf) 477 return 0; 478 479 ptr = strstr(buf, "]"); 480 if (!ptr) 481 return -EILSEQ; 482 483 if (get_ps_type(buf, ptr - buf, &type, &sub_type) < 0) 484 return -EILSEQ; 485 486 /* Check is data type is of array */ 487 if (type == ARRAY || sub_type == ARRAY) 488 format->array = TRUE; 489 490 if (type == STRING || sub_type == STRING) 491 format->array = FALSE; 492 493 if (type == DECIMAL || type == BINARY) 494 format->type = PS_DEC; 495 else 496 format->type = PS_HEX; 497 498 return 0; 499 } 500 501 502 503 #define UNDEFINED 0xFFFF 504 505 static unsigned int read_data_in_section(char *buf, struct ps_entry_type type) 506 { 507 char *ptr = buf; 508 509 if (!buf) 510 return UNDEFINED; 511 512 if (buf == strstr(buf, "[")) { 513 ptr = strstr(buf, "]"); 514 if (!ptr) 515 return UNDEFINED; 516 517 ptr++; 518 } 519 520 if (type.type == PS_HEX && type.array != TRUE) 521 return strtol(ptr, NULL, 16); 522 523 return UNDEFINED; 524 } 525 526 527 /* Read PS entries as string, convert and add to Hex array */ 528 static void update_tag_data(struct ps_cfg_entry *tag, 529 struct tag_info *info, const char *ptr) 530 { 531 char buf[3]; 532 533 buf[2] = '\0'; 534 535 strlcpy(buf, &ptr[info->char_cnt],sizeof(buf)); 536 tag->data[info->byte_count] = strtol(buf, NULL, 16); 537 info->char_cnt += 3; 538 info->byte_count++; 539 540 strlcpy(buf, &ptr[info->char_cnt], sizeof(buf)); 541 tag->data[info->byte_count] = strtol(buf, NULL, 16); 542 info->char_cnt += 3; 543 info->byte_count++; 544 } 545 546 static inline int update_char_count(const char *buf) 547 { 548 char *end_ptr; 549 550 if (strstr(buf, "[") == buf) { 551 end_ptr = strstr(buf, "]"); 552 if (!end_ptr) 553 return 0; 554 else 555 return(end_ptr - buf) + 1; 556 } 557 558 return 0; 559 } 560 561 #define PS_HEX 0 562 #define PS_DEC 1 563 564 static int ath_parse_ps(FILE *stream) 565 { 566 char buf[LINE_SIZE_MAX + 1]; 567 char *ptr; 568 uint8_t tag_cnt = 0; 569 int16_t byte_count = 0; 570 struct ps_entry_type format; 571 struct tag_info status = { 0, 0, 0, 0}; 572 573 do { 574 int read_count; 575 struct ps_cfg_entry *tag; 576 577 ptr = fgets(buf, LINE_SIZE_MAX, stream); 578 if (!ptr) 579 break; 580 581 __skip_space(ptr); 582 if (__check_comment(ptr)) 583 continue; 584 585 /* Lines with a '#' will be followed by new PS entry */ 586 if (ptr == strstr(ptr, "#")) { 587 if (status.section != PS_UNDEF) { 588 return -EILSEQ; 589 } else { 590 status.section = PS_ID; 591 continue; 592 } 593 } 594 595 tag = &ps_list[tag_cnt]; 596 597 switch (status.section) { 598 case PS_ID: 599 if (get_input_format(ptr, &format) < 0) 600 return -EILSEQ; 601 602 tag->id = read_data_in_section(ptr, format); 603 status.section = PS_LEN; 604 break; 605 606 case PS_LEN: 607 if (get_input_format(ptr, &format) < 0) 608 return -EILSEQ; 609 610 byte_count = read_data_in_section(ptr, format); 611 if (byte_count > PS_MAX_LEN) 612 return -EILSEQ; 613 614 tag->len = byte_count; 615 tag->data = (uint8_t *)malloc(byte_count); 616 617 status.section = PS_DATA; 618 status.line_count = 0; 619 break; 620 621 case PS_DATA: 622 if (status.line_count == 0) 623 if (get_input_format(ptr, &format) < 0) 624 return -EILSEQ; 625 626 __skip_space(ptr); 627 628 status.char_cnt = update_char_count(ptr); 629 630 read_count = (byte_count > ENTRY_PER_LINE) ? 631 ENTRY_PER_LINE : byte_count; 632 633 if (format.type == PS_HEX && format.array == TRUE) { 634 while (read_count > 0) { 635 update_tag_data(tag, &status, ptr); 636 read_count -= 2; 637 } 638 639 if (byte_count > ENTRY_PER_LINE) 640 byte_count -= ENTRY_PER_LINE; 641 else 642 byte_count = 0; 643 } 644 645 status.line_count++; 646 647 if (byte_count == 0) 648 memset(&status, 0x00, sizeof(struct tag_info)); 649 650 if (status.section == PS_UNDEF) 651 tag_cnt++; 652 653 if (tag_cnt == MAX_TAGS) 654 return -EILSEQ; 655 break; 656 } 657 } while (ptr); 658 659 return tag_cnt; 660 } 661 662 #define PS_RAM_SIZE 2048 663 664 static int ps_config_download(int fd, int tag_count) 665 { 666 if (write_ps_cmd(fd, PS_RESET, PS_RAM_SIZE) < 0) 667 return -1; 668 669 if (tag_count > 0) 670 if (write_ps_cmd(fd, PS_WRITE, tag_count) < 0) 671 return -1; 672 return 0; 673 } 674 675 static int write_bdaddr(int pConfig, char *bdaddr) 676 { 677 uint8_t *event; 678 int err; 679 uint8_t cmd[13]; 680 uint8_t *ptr = cmd; 681 hci_command_hdr *ch = (void *)cmd; 682 683 memset(cmd, 0, sizeof(cmd)); 684 685 ch->opcode = htobs(cmd_opcode_pack(HCI_VENDOR_CMD_OGF, 686 HCI_PS_CMD_OCF)); 687 ch->plen = 10; 688 ptr += HCI_COMMAND_HDR_SIZE; 689 690 ptr[0] = 0x01; 691 ptr[1] = 0x01; 692 ptr[2] = 0x00; 693 ptr[3] = 0x06; 694 695 convert_bdaddr(bdaddr, (char *)&ptr[4]); 696 697 err = send_hci_cmd_sync(pConfig, cmd, sizeof(cmd), &event); 698 if (err < 0) 699 return err; 700 701 err = read_ps_event(event, HCI_PS_CMD_OCF); 702 703 free(event); 704 705 return err; 706 } 707 708 static void write_bdaddr_from_file(int rom_version, int fd) 709 { 710 FILE *stream; 711 char bdaddr[PATH_MAX]; 712 char bdaddr_file[PATH_MAX]; 713 714 snprintf(bdaddr_file, MAXPATHLEN, "%s%x/%s", 715 FW_PATH, rom_version, BDADDR_FILE); 716 717 stream = fopen(bdaddr_file, "r"); 718 if (!stream) 719 return; 720 721 if (fgets(bdaddr, PATH_MAX - 1, stream)) 722 write_bdaddr(fd, bdaddr); 723 724 fclose(stream); 725 } 726 727 #define HCI_EVT_CMD_CMPL_OPCODE 3 728 #define HCI_EVT_CMD_CMPL_STATUS_RET_BYTE 5 729 730 void baswap(bdaddr_t *dst, const bdaddr_t *src) 731 { 732 register unsigned char *d = (unsigned char *) dst; 733 register const unsigned char *s = (const unsigned char *) src; 734 register int i; 735 for (i = 0; i < 6; i++) 736 d[i] = s[5-i]; 737 } 738 739 740 int str2ba(const char *str, bdaddr_t *ba) 741 { 742 uint8_t b[6]; 743 const char *ptr = str; 744 int i; 745 746 for (i = 0; i < 6; i++) { 747 b[i] = (uint8_t) strtol(ptr, NULL, 16); 748 ptr = strchr(ptr, ':'); 749 if (i != 5 && !ptr) 750 ptr = ":00:00:00:00:00"; 751 ptr++; 752 } 753 baswap(ba, (bdaddr_t *) b); 754 return 0; 755 } 756 757 #define DEV_REGISTER 0x4FFC 758 #define GET_DEV_TYPE_OCF 0x05 759 760 static int get_device_type(int dev, uint32_t *code) 761 { 762 uint8_t cmd[8] = {0}; 763 uint8_t *event; 764 uint32_t reg; 765 int err; 766 uint8_t *ptr = cmd; 767 hci_command_hdr *ch = (void *)cmd; 768 769 ch->opcode = htobs(cmd_opcode_pack(HCI_VENDOR_CMD_OGF, 770 GET_DEV_TYPE_OCF)); 771 ch->plen = 5; 772 ptr += HCI_COMMAND_HDR_SIZE; 773 774 ptr[0] = (uint8_t)DEV_REGISTER; 775 ptr[1] = (uint8_t)DEV_REGISTER >> 8; 776 ptr[2] = (uint8_t)DEV_REGISTER >> 16; 777 ptr[3] = (uint8_t)DEV_REGISTER >> 24; 778 ptr[4] = 0x04; 779 780 err = send_hci_cmd_sync(dev, cmd, sizeof(cmd), &event); 781 if (err < 0) 782 return err; 783 784 err = read_ps_event(event, GET_DEV_TYPE_OCF); 785 if (err < 0) 786 goto cleanup; 787 788 reg = event[10]; 789 reg = (reg << 8) | event[9]; 790 reg = (reg << 8) | event[8]; 791 reg = (reg << 8) | event[7]; 792 *code = reg; 793 794 cleanup: 795 free(event); 796 797 return err; 798 } 799 800 #define GET_VERSION_OCF 0x1E 801 802 static int read_ath3k_version(int pConfig, uint32_t *rom_version, 803 uint32_t *build_version) 804 { 805 uint8_t cmd[3] = {0}; 806 uint8_t *event; 807 int err; 808 int status; 809 hci_command_hdr *ch = (void *)cmd; 810 811 ch->opcode = htobs(cmd_opcode_pack(HCI_VENDOR_CMD_OGF, 812 GET_VERSION_OCF)); 813 ch->plen = 0; 814 815 err = send_hci_cmd_sync(pConfig, cmd, sizeof(cmd), &event); 816 if (err < 0) 817 return err; 818 819 err = read_ps_event(event, GET_VERSION_OCF); 820 if (err < 0) 821 goto cleanup; 822 823 status = event[10]; 824 status = (status << 8) | event[9]; 825 status = (status << 8) | event[8]; 826 status = (status << 8) | event[7]; 827 *rom_version = status; 828 829 status = event[14]; 830 status = (status << 8) | event[13]; 831 status = (status << 8) | event[12]; 832 status = (status << 8) | event[11]; 833 *build_version = status; 834 835 cleanup: 836 free(event); 837 838 return err; 839 } 840 841 #define VERIFY_CRC 9 842 #define PS_REGION 1 843 #define PATCH_REGION 2 844 845 static int get_ath3k_crc(int dev) 846 { 847 uint8_t cmd[7] = {0}; 848 uint8_t *event; 849 int err; 850 851 load_hci_ps_hdr(cmd, VERIFY_CRC, 0, PS_REGION | PATCH_REGION); 852 853 err = send_hci_cmd_sync(dev, cmd, sizeof(cmd), &event); 854 if (err < 0) 855 return err; 856 /* Send error code if CRC check patched */ 857 if (read_ps_event(event, HCI_PS_CMD_OCF) >= 0) 858 err = -EILSEQ; 859 860 free(event); 861 862 return err; 863 } 864 865 #define SET_PATCH_RAM_ID 0x0D 866 #define SET_PATCH_RAM_CMD_SIZE 11 867 #define ADDRESS_LEN 4 868 static int set_patch_ram(int dev, char *patch_loc, int len) 869 { 870 int err; 871 uint8_t cmd[20] = {0}; 872 int i, j; 873 char loc_byte[3]; 874 uint8_t *event; 875 uint8_t *loc_ptr = &cmd[7]; 876 877 if (!patch_loc) 878 return -1; 879 880 loc_byte[2] = '\0'; 881 882 load_hci_ps_hdr(cmd, SET_PATCH_RAM_ID, ADDRESS_LEN, 0); 883 884 for (i = 0, j = 3; i < 4; i++, j--) { 885 loc_byte[0] = patch_loc[0]; 886 loc_byte[1] = patch_loc[1]; 887 loc_ptr[j] = strtol(loc_byte, NULL, 16); 888 patch_loc += 2; 889 } 890 891 err = send_hci_cmd_sync(dev, cmd, SET_PATCH_RAM_CMD_SIZE, &event); 892 if (err < 0) 893 return err; 894 895 err = read_ps_event(event, HCI_PS_CMD_OCF); 896 897 free(event); 898 899 return err; 900 } 901 902 #define PATCH_LOC_KEY "DA:" 903 #define PATCH_LOC_STRING_LEN 8 904 static int ps_patch_download(int fd, FILE *stream) 905 { 906 char byte[3]; 907 char ptr[MAX_PATCH_CMD + 1]; 908 int byte_cnt; 909 int patch_count = 0; 910 char patch_loc[PATCH_LOC_STRING_LEN + 1]; 911 912 byte[2] = '\0'; 913 914 while (fgets(ptr, MAX_PATCH_CMD, stream)) { 915 if (strlen(ptr) <= 1) 916 continue; 917 else if (strstr(ptr, PATCH_LOC_KEY) == ptr) { 918 strlcpy(patch_loc, &ptr[sizeof(PATCH_LOC_KEY) - 1], 919 PATCH_LOC_STRING_LEN); 920 if (set_patch_ram(fd, patch_loc, sizeof(patch_loc)) < 0) 921 return -1; 922 } else if (isxdigit(ptr[0])) 923 break; 924 else 925 return -1; 926 } 927 928 byte_cnt = strtol(ptr, NULL, 16); 929 930 while (byte_cnt > 0) { 931 int i; 932 uint8_t cmd[HCI_MAX_CMD_SIZE] = {0}; 933 struct patch_entry patch; 934 935 if (byte_cnt > MAX_PATCH_CMD) 936 patch.len = MAX_PATCH_CMD; 937 else 938 patch.len = byte_cnt; 939 940 for (i = 0; i < patch.len; i++) { 941 if (!fgets(byte, 3, stream)) 942 return -1; 943 944 patch.data[i] = strtoul(byte, NULL, 16); 945 } 946 947 load_hci_ps_hdr(cmd, WRITE_PATCH, patch.len, patch_count); 948 memcpy(&cmd[HCI_PS_CMD_HDR_LEN], patch.data, patch.len); 949 950 if (write_cmd(fd, cmd, patch.len + HCI_PS_CMD_HDR_LEN) < 0) 951 return -1; 952 953 patch_count++; 954 byte_cnt = byte_cnt - MAX_PATCH_CMD; 955 } 956 957 if (write_ps_cmd(fd, ENABLE_PATCH, 0) < 0) 958 return -1; 959 960 return patch_count; 961 } 962 963 static int ath_ps_download(int fd) 964 { 965 int err = 0; 966 int tag_count; 967 int patch_count = 0; 968 uint32_t rom_version = 0; 969 uint32_t build_version = 0; 970 uint32_t dev_type = 0; 971 char patch_file[PATH_MAX]; 972 char ps_file[PATH_MAX]; 973 FILE *stream; 974 975 /* 976 * Verfiy firmware version. depending on it select the PS 977 * config file to download. 978 */ 979 if (get_device_type(fd, &dev_type) < 0) { 980 err = -EILSEQ; 981 goto download_cmplete; 982 } 983 984 if (read_ath3k_version(fd, &rom_version, &build_version) < 0) { 985 err = -EILSEQ; 986 goto download_cmplete; 987 } 988 989 /* Do not download configuration if CRC passes */ 990 if (get_ath3k_crc(fd) < 0) { 991 err = 0; 992 goto download_cmplete; 993 } 994 995 get_ps_file_name(dev_type, rom_version, ps_file); 996 get_patch_file_name(dev_type, rom_version, build_version, patch_file); 997 998 stream = fopen(ps_file, "r"); 999 if (!stream) { 1000 ALOGI("firmware file open error:%s, ver:%x\n",ps_file, rom_version); 1001 if (rom_version == 0x1020201) 1002 err = 0; 1003 else 1004 err = -EILSEQ; 1005 goto download_cmplete; 1006 } 1007 tag_count = ath_parse_ps(stream); 1008 1009 fclose(stream); 1010 1011 if (tag_count < 0) { 1012 err = -EILSEQ; 1013 goto download_cmplete; 1014 } 1015 1016 /* 1017 * It is not necessary that Patch file be available, 1018 * continue with PS Operations if patch file is not available. 1019 */ 1020 if (patch_file[0] == '\0') 1021 err = 0; 1022 1023 stream = fopen(patch_file, "r"); 1024 if (!stream) 1025 err = 0; 1026 else { 1027 patch_count = ps_patch_download(fd, stream); 1028 fclose(stream); 1029 1030 if (patch_count < 0) { 1031 err = -EILSEQ; 1032 goto download_cmplete; 1033 } 1034 } 1035 1036 err = ps_config_download(fd, tag_count); 1037 1038 download_cmplete: 1039 if (!err) 1040 write_bdaddr_from_file(rom_version, fd); 1041 1042 return err; 1043 } 1044 1045 int ath3k_init(int fd, int speed, int init_speed, char *bdaddr, struct termios *ti) 1046 { 1047 ALOGI(" %s ", __FUNCTION__); 1048 1049 int r; 1050 int err = 0; 1051 struct timespec tm = { 0, 500000}; 1052 unsigned char cmd[MAX_CMD_LEN] = {0}; 1053 unsigned char rsp[HCI_MAX_EVENT_SIZE]; 1054 unsigned char *ptr = cmd + 1; 1055 hci_command_hdr *ch = (void *)ptr; 1056 int flags = 0; 1057 1058 if (ioctl(fd, TIOCMGET, &flags) < 0) { 1059 ALOGI("TIOCMGET failed in init\n"); 1060 return -1; 1061 } 1062 flags |= TIOCM_RTS; 1063 if (ioctl(fd, TIOCMSET, &flags) < 0) { 1064 ALOGI("TIOCMSET failed in init: HW Flow-on error\n"); 1065 return -1; 1066 } 1067 1068 /* set both controller and host baud rate to maximum possible value */ 1069 err = set_cntrlr_baud(fd, speed); 1070 ALOGI("set_cntrlr_baud : ret:%d \n", err); 1071 if (err < 0) 1072 return err; 1073 1074 err = set_speed(fd, ti, speed); 1075 if (err < 0) { 1076 ALOGI("Can't set required baud rate"); 1077 return err; 1078 } 1079 1080 /* Download PS and patch */ 1081 r = ath_ps_download(fd); 1082 if (r < 0) { 1083 ALOGI("Failed to Download configuration"); 1084 err = -ETIMEDOUT; 1085 goto failed; 1086 } 1087 1088 ALOGI("ath_ps_download is done\n"); 1089 1090 cmd[0] = HCI_COMMAND_PKT; 1091 /* Write BDADDR */ 1092 if (bdaddr) { 1093 ch->opcode = htobs(cmd_opcode_pack(HCI_VENDOR_CMD_OGF, 1094 HCI_PS_CMD_OCF)); 1095 ch->plen = 10; 1096 ptr += HCI_COMMAND_HDR_SIZE; 1097 1098 ptr[0] = 0x01; 1099 ptr[1] = 0x01; 1100 ptr[2] = 0x00; 1101 ptr[3] = 0x06; 1102 str2ba(bdaddr, (bdaddr_t *)(ptr + 4)); 1103 1104 if (write(fd, cmd, WRITE_BDADDR_CMD_LEN) != 1105 WRITE_BDADDR_CMD_LEN) { 1106 ALOGI("Failed to write BD_ADDR command\n"); 1107 err = -ETIMEDOUT; 1108 goto failed; 1109 } 1110 1111 if (read_hci_event(fd, rsp, sizeof(rsp)) < 0) { 1112 ALOGI("Failed to set BD_ADDR\n"); 1113 err = -ETIMEDOUT; 1114 goto failed; 1115 } 1116 } 1117 1118 /* Send HCI Reset */ 1119 cmd[1] = 0x03; 1120 cmd[2] = 0x0C; 1121 cmd[3] = 0x00; 1122 1123 r = write(fd, cmd, 4); 1124 if (r != 4) { 1125 err = -ETIMEDOUT; 1126 goto failed; 1127 } 1128 1129 nanosleep(&tm, NULL); 1130 if (read_hci_event(fd, rsp, sizeof(rsp)) < 0) { 1131 err = -ETIMEDOUT; 1132 goto failed; 1133 } 1134 1135 ALOGI("HCI Reset is done\n"); 1136 err = set_cntrlr_baud(fd, speed); 1137 if (err < 0) 1138 ALOGI("set_cntrlr_baud0:%d,%d\n", speed, err); 1139 1140 failed: 1141 if (err < 0) { 1142 set_cntrlr_baud(fd, init_speed); 1143 set_speed(fd, ti, init_speed); 1144 } 1145 1146 return err; 1147 1148 } 1149 #define BTPROTO_HCI 1 1150 1151 /* Open HCI device. 1152 * Returns device descriptor (dd). */ 1153 int hci_open_dev(int dev_id) 1154 { 1155 struct sockaddr_hci a; 1156 int dd, err; 1157 1158 /* Create HCI socket */ 1159 dd = socket(AF_BLUETOOTH, SOCK_RAW, BTPROTO_HCI); 1160 if (dd < 0) 1161 return dd; 1162 1163 /* Bind socket to the HCI device */ 1164 memset(&a, 0, sizeof(a)); 1165 a.hci_family = AF_BLUETOOTH; 1166 a.hci_dev = dev_id; 1167 if (bind(dd, (struct sockaddr *) &a, sizeof(a)) < 0) 1168 goto failed; 1169 1170 return dd; 1171 1172 failed: 1173 err = errno; 1174 close(dd); 1175 errno = err; 1176 1177 return -1; 1178 } 1179 1180 int hci_close_dev(int dd) 1181 { 1182 return close(dd); 1183 } 1184 1185 /* HCI functions that require open device 1186 * dd - Device descriptor returned by hci_open_dev. */ 1187 1188 int hci_send_cmd(int dd, uint16_t ogf, uint16_t ocf, uint8_t plen, void *param) 1189 { 1190 uint8_t type = HCI_COMMAND_PKT; 1191 hci_command_hdr hc; 1192 struct iovec iv[3]; 1193 int ivn; 1194 1195 hc.opcode = htobs(cmd_opcode_pack(ogf, ocf)); 1196 hc.plen= plen; 1197 1198 iv[0].iov_base = &type; 1199 iv[0].iov_len = 1; 1200 iv[1].iov_base = &hc; 1201 iv[1].iov_len = HCI_COMMAND_HDR_SIZE; 1202 ivn = 2; 1203 1204 if (plen) { 1205 iv[2].iov_base = param; 1206 iv[2].iov_len = plen; 1207 ivn = 3; 1208 } 1209 1210 while (writev(dd, iv, ivn) < 0) { 1211 if (errno == EAGAIN || errno == EINTR) 1212 continue; 1213 return -1; 1214 } 1215 return 0; 1216 } 1217 1218 #define HCI_SLEEP_CMD_OCF 0x04 1219 #define TIOCSETD 0x5423 1220 #define HCIUARTSETFLAGS _IOW('U', 204, int) 1221 #define HCIUARTSETPROTO _IOW('U', 200, int) 1222 #define HCIUARTGETDEVICE _IOW('U', 202, int) 1223 /* 1224 * Atheros AR300x specific initialization post callback 1225 */ 1226 int ath3k_post(int fd, int pm) 1227 { 1228 int dev_id, dd; 1229 struct timespec tm = { 0, 50000}; 1230 1231 sleep(1); 1232 1233 dev_id = ioctl(fd, HCIUARTGETDEVICE, 0); 1234 if (dev_id < 0) { 1235 perror("cannot get device id"); 1236 return dev_id; 1237 } 1238 1239 dd = hci_open_dev(dev_id); 1240 if (dd < 0) { 1241 perror("HCI device open failed"); 1242 return dd; 1243 } 1244 1245 if (ioctl(dd, HCIDEVUP, dev_id) < 0 && errno != EALREADY) { 1246 perror("hci down:Power management Disabled"); 1247 hci_close_dev(dd); 1248 return -1; 1249 } 1250 1251 /* send vendor specific command with Sleep feature Enabled */ 1252 if (hci_send_cmd(dd, OGF_VENDOR_CMD, HCI_SLEEP_CMD_OCF, 1, &pm) < 0) 1253 perror("PM command failed, power management Disabled"); 1254 1255 nanosleep(&tm, NULL); 1256 hci_close_dev(dd); 1257 1258 return 0; 1259 } 1260 1261 1262 1263 #define FLOW_CTL 0x0001 1264 #define ENABLE_PM 1 1265 #define DISABLE_PM 0 1266 1267 /* Initialize UART driver */ 1268 static int init_uart(char *dev, struct uart_t *u, int send_break, int raw) 1269 { 1270 ALOGI(" %s ", __FUNCTION__); 1271 1272 struct termios ti; 1273 1274 int i, fd; 1275 unsigned long flags = 0; 1276 1277 if (raw) 1278 flags |= 1 << HCI_UART_RAW_DEVICE; 1279 1280 1281 fd = open(dev, O_RDWR | O_NOCTTY); 1282 1283 if (fd < 0) { 1284 ALOGI("Can't open serial port"); 1285 return -1; 1286 } 1287 1288 1289 tcflush(fd, TCIOFLUSH); 1290 1291 if (tcgetattr(fd, &ti) < 0) { 1292 ALOGI("Can't get port settings: %d\n", errno); 1293 return -1; 1294 } 1295 1296 cfmakeraw(&ti); 1297 1298 ti.c_cflag |= CLOCAL; 1299 if (u->flags & FLOW_CTL) 1300 ti.c_cflag |= CRTSCTS; 1301 else 1302 ti.c_cflag &= ~CRTSCTS; 1303 1304 if (tcsetattr(fd, TCSANOW, &ti) < 0) { 1305 ALOGI("Can't set port settings"); 1306 return -1; 1307 } 1308 1309 if (set_speed(fd, &ti, u->init_speed) < 0) { 1310 ALOGI("Can't set initial baud rate"); 1311 return -1; 1312 } 1313 1314 tcflush(fd, TCIOFLUSH); 1315 1316 if (send_break) { 1317 tcsendbreak(fd, 0); 1318 usleep(500000); 1319 } 1320 1321 ath3k_init(fd,u->speed,u->init_speed,u->bdaddr, &ti); 1322 1323 ALOGI("Device setup complete\n"); 1324 1325 1326 tcflush(fd, TCIOFLUSH); 1327 1328 // Set actual baudrate 1329 /* 1330 if (set_speed(fd, &ti, u->speed) < 0) { 1331 perror("Can't set baud rate"); 1332 return -1; 1333 } 1334 1335 i = N_HCI; 1336 if (ioctl(fd, TIOCSETD, &i) < 0) { 1337 perror("Can't set line discipline"); 1338 return -1; 1339 } 1340 1341 if (flags && ioctl(fd, HCIUARTSETFLAGS, flags) < 0) { 1342 perror("Can't set UART flags"); 1343 return -1; 1344 } 1345 1346 if (ioctl(fd, HCIUARTSETPROTO, u->proto) < 0) { 1347 perror("Can't set device"); 1348 return -1; 1349 } 1350 1351 #if !defined(SW_BOARD_HAVE_BLUETOOTH_RTK) 1352 ath3k_post(fd, u->pm); 1353 #endif 1354 */ 1355 1356 return fd; 1357 } 1358 1359 1360 int hw_config_ath3k(char *port_name) 1361 { 1362 ALOGI(" %s ", __FUNCTION__); 1363 PSCounter=0; 1364 struct sigaction sa; 1365 struct uart_t u ; 1366 int n=0,send_break=0,raw=0; 1367 1368 memset(&u, 0, sizeof(u)); 1369 u.speed =3000000; 1370 u.init_speed =115200; 1371 u.flags |= FLOW_CTL; 1372 u.pm = DISABLE_PM; 1373 1374 n = init_uart(port_name, &u, send_break, raw); 1375 if (n < 0) { 1376 ALOGI("Can't initialize device"); 1377 } 1378 1379 return n; 1380 } 1381 1382 void lpm_set_ar3k(uint8_t pio, uint8_t action, uint8_t polarity) 1383 { 1384 int rc; 1385 int fd = -1; 1386 char buffer; 1387 1388 ALOGI("lpm mode: %d action: %d", pio, action); 1389 1390 switch (pio) 1391 { 1392 case UPIO_LPM_MODE: 1393 if (upio_state[UPIO_LPM_MODE] == action) 1394 { 1395 ALOGI("LPM is %s already", lpm_mode[action]); 1396 return; 1397 } 1398 1399 fd = open(VENDOR_LPM_PROC_NODE, O_WRONLY); 1400 1401 if (fd < 0) 1402 { 1403 ALOGE("upio_set : open(%s) for write failed: %s (%d)", 1404 VENDOR_LPM_PROC_NODE, strerror(errno), errno); 1405 return; 1406 } 1407 1408 if (action == UPIO_ASSERT) 1409 { 1410 buffer = '1'; 1411 } 1412 else 1413 { 1414 buffer = '0'; 1415 } 1416 1417 if (write(fd, &buffer, 1) < 0) 1418 { 1419 ALOGE("upio_set : write(%s) failed: %s (%d)", 1420 VENDOR_LPM_PROC_NODE, strerror(errno),errno); 1421 } 1422 else 1423 { 1424 upio_state[UPIO_LPM_MODE] = action; 1425 ALOGI("LPM is set to %s", lpm_mode[action]); 1426 } 1427 1428 if (fd >= 0) 1429 close(fd); 1430 1431 break; 1432 1433 case UPIO_BT_WAKE: 1434 /* UPIO_DEASSERT should be allowed because in Rx case assert occur 1435 * from the remote side where as deassert will be initiated from Host 1436 */ 1437 if ((action == UPIO_ASSERT) && (upio_state[UPIO_BT_WAKE] == action)) 1438 { 1439 ALOGI("BT_WAKE is %s already", lpm_state[action]); 1440 1441 return; 1442 } 1443 1444 if (action == UPIO_DEASSERT) 1445 buffer = '0'; 1446 else 1447 buffer = '1'; 1448 1449 fd = open(VENDOR_BTWRITE_PROC_NODE, O_WRONLY); 1450 1451 if (fd < 0) 1452 { 1453 ALOGE("upio_set : open(%s) for write failed: %s (%d)", 1454 VENDOR_BTWRITE_PROC_NODE, strerror(errno), errno); 1455 return; 1456 } 1457 1458 if (write(fd, &buffer, 1) < 0) 1459 { 1460 ALOGE("upio_set : write(%s) failed: %s (%d)", 1461 VENDOR_BTWRITE_PROC_NODE, strerror(errno),errno); 1462 } 1463 else 1464 { 1465 upio_state[UPIO_BT_WAKE] = action; 1466 ALOGI("BT_WAKE is set to %s", lpm_state[action]); 1467 } 1468 1469 ALOGI("proc btwrite assertion"); 1470 1471 if (fd >= 0) 1472 close(fd); 1473 1474 break; 1475 1476 case UPIO_HOST_WAKE: 1477 ALOGI("upio_set: UPIO_HOST_WAKE"); 1478 break; 1479 } 1480 1481 } 1482