diff --git a/realtek/rtk_hciattach/hciattach_rtk.c b/realtek/rtk_hciattach/hciattach_rtk.c
|
old mode 100644
|
new mode 100755
|
index b195b1b..b33040b
|
--- a/realtek/rtk_hciattach/hciattach_rtk.c
|
+++ b/realtek/rtk_hciattach/hciattach_rtk.c
|
@@ -67,6 +67,7 @@
|
#define BT_CONFIG_DIRECTORY "/lib/firmware/rtlbt/"
|
|
#ifdef USE_CUSTOMER_ADDRESS
|
+#define BT_ADDR_FROM_VENDOR_STORAGE
|
#define BT_ADDR_FILE "/opt/bdaddr"
|
static uint8_t customer_bdaddr = 0;
|
#endif
|
@@ -2216,14 +2217,13 @@ int bachk(const char *str)
|
* @param bt_addr where bt addr is stored
|
*
|
*/
|
-/* static void rtk_get_ram_addr(char bt_addr[0])
|
- * {
|
- * srand(time(NULL) + getpid() + getpid() * 987654 + rand());
|
- *
|
- * RT_U32 addr = rand();
|
- * memcpy(bt_addr, &addr, sizeof(RT_U8));
|
- * }
|
- */
|
+static void rtk_get_ram_addr(char bt_addr[0])
|
+{
|
+ srand(time(NULL) + getpid() + getpid() * 987654 + rand());
|
+
|
+ RT_U32 addr = rand();
|
+ memcpy(bt_addr, &addr, sizeof(RT_U8));
|
+}
|
|
/**
|
* Write the random bt addr to the file /data/misc/bluetoothd/bt_mac/btmac.txt.
|
@@ -2249,6 +2249,154 @@ int bachk(const char *str)
|
* }
|
* }
|
*/
|
+#ifdef BT_ADDR_FROM_VENDOR_STORAGE
|
+
|
+typedef unsigned short uint16;
|
+typedef unsigned int uint32;
|
+typedef unsigned char uint8;
|
+
|
+#define VENDOR_REQ_TAG 0x56524551
|
+#define VENDOR_READ_IO _IOW('v', 0x01, unsigned int)
|
+#define VENDOR_WRITE_IO _IOW('v', 0x02, unsigned int)
|
+
|
+#define VENDOR_ID_MAX 5
|
+static char *vendor_id_table[] = {
|
+ "VENDOR_SN_ID",
|
+ "VENDOR_WIFI_MAC_ID",
|
+ "VENDOR_LAN_MAC_ID",
|
+ "VENDOR_BT_MAC_ID",
|
+ "VENDOR_IMEI_ID",
|
+};
|
+
|
+#define VENDOR_SN_ID 1
|
+#define VENDOR_WIFI_MAC_ID 2
|
+#define VENDOR_LAN_MAC_ID 3
|
+#define VENDOR_BT_MAC_ID 4
|
+#define VENDOR_IMEI_ID 5
|
+
|
+#define VENDOR_STORAGE_DEBUG
|
+
|
+struct rk_vendor_req {
|
+ uint32 tag;
|
+ uint16 id;
|
+ uint16 len;
|
+ uint8 data[1024];
|
+};
|
+
|
+static void rknand_get_randeom_btaddr(char *bt_addr)
|
+{
|
+ int i;
|
+ /* No autogen BDA. Generate one now. */
|
+ bt_addr[4] = 0x22;
|
+ bt_addr[5] = 0x22;
|
+ for (i = 0; i < 4; i++)
|
+ rtk_get_ram_addr(&bt_addr[i]);
|
+}
|
+
|
+static void rknand_print_hex_data(uint8 *s, struct rk_vendor_req *buf, uint32 len)
|
+{
|
+ unsigned char i = 0;
|
+
|
+#ifdef VENDOR_STORAGE_DEBUG
|
+ fprintf(stdout, "%s\n",s);
|
+ fprintf(stdout, "tag = %d // id = %d // len = %d // data = 0x%p\n", buf->tag, buf->id, buf->len, buf->data);
|
+#endif
|
+
|
+ printf("%s: ", vendor_id_table[buf->id - 1]);
|
+ if (buf->id == VENDOR_SN_ID ||
|
+ buf->id == VENDOR_IMEI_ID) {
|
+ for (i = 0; i < len; i++)
|
+ printf("%c", buf->data[i]);
|
+ } else {
|
+ for (i = 0; i < len; i++)
|
+ printf("%02x", buf->data[i]);
|
+ }
|
+ fprintf(stdout, "\n");
|
+}
|
+
|
+static int vendor_storage_read(int cmd, char *buf, int buf_len)
|
+{
|
+ uint32 i;
|
+ int ret ;
|
+ uint8 p_buf[100]; /* malloc req buffer or used extern buffer */
|
+ struct rk_vendor_req *req;
|
+
|
+ req = (struct rk_vendor_req *)p_buf;
|
+ memset(p_buf, 0, 100);
|
+ int sys_fd = open("/dev/vendor_storage", O_RDWR, 0);
|
+ if(sys_fd < 0){
|
+ printf("vendor_storage open fail\n");
|
+ return -1;
|
+ }
|
+
|
+ req->tag = VENDOR_REQ_TAG;
|
+ req->id = cmd;
|
+ req->len = 50;
|
+
|
+ ret = ioctl(sys_fd, VENDOR_READ_IO, req);
|
+
|
+ if(ret){
|
+ printf("vendor read error %d\n", ret);
|
+ return -1;
|
+ }
|
+ close(sys_fd);
|
+
|
+ rknand_print_hex_data("vendor read:", req, req->len);
|
+ memcpy(buf, req->data, req->len);
|
+ return req->len;
|
+}
|
+static int vendor_storage_write(int cmd, char *num)
|
+{
|
+ uint32 i;
|
+ int ret ;
|
+ uint8 p_buf[100]; /* malloc req buffer or used extern buffer */
|
+ struct rk_vendor_req *req;
|
+
|
+ req = (struct rk_vendor_req *)p_buf;
|
+ int sys_fd = open("/dev/vendor_storage",O_RDWR,0);
|
+ if(sys_fd < 0){
|
+ printf("vendor_storage open fail\n");
|
+ return -1;
|
+ }
|
+
|
+ req->tag = VENDOR_REQ_TAG;
|
+ req->id = cmd;
|
+
|
+ if (cmd != VENDOR_SN_ID && cmd != VENDOR_IMEI_ID)
|
+ req->len = 6;
|
+ else
|
+ req->len = strlen(num);
|
+ memcpy(req->data, num, req->len);
|
+
|
+ ret = ioctl(sys_fd, VENDOR_WRITE_IO, req);
|
+ if(ret){
|
+ printf("vendor write error\n");
|
+ return -1;
|
+ }
|
+
|
+ rknand_print_hex_data("vendor write:", req, req->len);
|
+ return 0;
|
+}
|
+static int vendor_storage_read_bt_addr(uint8_t *tbuf)
|
+{
|
+ uint8 raw_buf[100] = {0};
|
+ int raw_len = 0;
|
+ int i;
|
+
|
+ raw_len = vendor_storage_read(VENDOR_BT_MAC_ID, raw_buf, 100);
|
+ if (raw_len < 0)
|
+ return -1;
|
+ for (i = 0; i < 6; i++) {
|
+ sprintf(tbuf + i * 3, "%02x:", raw_buf[i]);
|
+ }
|
+ tbuf[17] = '\0';
|
+ return 17;
|
+}
|
+static int vendor_storage_write_bt_addr(char *tbuf)
|
+{
|
+ return vendor_storage_write(VENDOR_BT_MAC_ID, tbuf);
|
+}
|
+#endif
|
#endif
|
|
/**
|
@@ -2280,6 +2428,38 @@ int rtk_get_bt_config(struct btrtl_info *btrtl, uint8_t **config_buf,
|
uint8_t tbuf[BDADDR_STRING_LEN + 1];
|
char *str;
|
|
+#ifdef BT_ADDR_FROM_VENDOR_STORAGE
|
+ ret = vendor_storage_read_bt_addr(tbuf);
|
+ if (ret >= 0 && bachk(tbuf) < 0) {
|
+ ret = -1;
|
+ RS_ERR("vendor_storage bt addr chechk failed");
|
+ }
|
+ if (ret < 0) {
|
+ RS_ERR("vendor storage read bt addr failed, generate one");
|
+
|
+ rknand_get_randeom_btaddr(bt_addr);
|
+ vendor_storage_write_bt_addr(bt_addr);
|
+ customer_bdaddr = 1;
|
+ } else {
|
+ str = tbuf;
|
+ for (i = 5; i >= 0; i--) {
|
+ bt_addr[i] = (uint8_t)strtoul(str, NULL, 16);
|
+ str += 3;
|
+ }
|
+
|
+ /*reserve LAP addr from 0x9e8b00 to 0x9e8b3f, change to 0x008b** */
|
+ if (0x9e == bt_addr[3] && 0x8b == bt_addr[4]
|
+ && (bt_addr[5] <= 0x3f)) {
|
+ bt_addr[3] = 0x00;
|
+ }
|
+
|
+ RS_DBG("BT MAC is %02x:%02x:%02x:%02x:%02x:%02x",
|
+ bt_addr[5], bt_addr[4],
|
+ bt_addr[3], bt_addr[2],
|
+ bt_addr[1], bt_addr[0]);
|
+ customer_bdaddr = 1;
|
+ }
|
+#else
|
if (stat(BT_ADDR_FILE, &st) < 0) {
|
RS_INFO("Couldnt access customer BT MAC file %s",
|
BT_ADDR_FILE);
|
@@ -2333,6 +2513,7 @@ int rtk_get_bt_config(struct btrtl_info *btrtl, uint8_t **config_buf,
|
customer_bdaddr = 1;
|
}
|
#endif
|
+#endif
|
|
GET_CONFIG:
|
//ret = sprintf(bt_config_file_name, BT_CONFIG_DIRECTORY "rtlbt_config");
|