[BT programming]
[BT programming developer kit]
BT programming在TI的CC2640/CC2650系列來說若要在PC端programming可以找到很多資料不是太大的難題
但若要在Linux底下programming,除非原廠的協助,否則很難找到相關文獻
好在原廠有提供一些幫忙,在CC26xx系列與CC13XX系列的Bootloader的位置是一樣的所以我們可以沿用。
原廠文獻參考:
一開始先是透過相同問題找到這篇 : CC2640R2F: sbl code on Linux點選下方提供的網址來到 : Running the Example Applications
並找到了開發工具的網址 : TI 15.4-Stack Gateway Linux Software Development Kit
在Buy from Texas Instruments or Third Party 欄位選擇Get Software按鈕可以進到下面頁面
http://www.ti.com/tool/download/TI-15-4-STACK-GATEWAY-LINUX-SDK
[BT programming debugging]
Strace是一個很好用的工具S代表的是system,主要就是可以透過系統的載入程式來偵錯,看程式的flow。
在嵌入式系統中是透過在Buildroot底下輸入make menuconfig去裝起來,
我們可以在
有關Strace的文章網路很多我們可以參考 : 參考
以下圖
strace -xxf -T -eread=3 -ewrite=3 ./host_cc13xx-sbl /dev/ttySP1 R13.bin -e -p -v > 123.log
-T代表的是印出每一行間隔的時間
[BT pass throught]
參考官網教學:poll
#include <stdio.h>
#include <unistd.h>
#include <sys/poll.h>//首先include
struct pollfd fds[2];//宣告大小為2的fds結構體
fds[0].fd = fd;//將一已宣告之file node assign給fds結構體
fds[0].events = POLLIN;//宣告等待poll的事件類型為輸入
fds[0].events = POLLIN;//宣告等待poll的事件類型為輸入
fds[1].fd = bt_fd;
fds[1].events = POLLIN;
ret = poll(fds, 2, 5000);//time out 5000ms(5s)
if(ret == -1)
{
perror("poll error");
return 1;
}
perror("poll error");
return 1;
}
if(!ret)
{
printf("5 seconds elapsed.\n");
return 0;
}
if(fds[0].revents & POLLIN)
printf("5 seconds elapsed.\n");
return 0;
}
if(fds[0].revents & POLLIN)
{
printf("fds[0] can read\n");//設定fds[0]有事件進來時的處理應對策略
}
if(fds[1].revents & POLLIN)
printf("fds[0] can read\n");//設定fds[0]有事件進來時的處理應對策略
}
if(fds[1].revents & POLLIN)
{
printf("fds[1] can read\n");
}
return 0;
由於pass throught的
資料在一般模式下會視為char轉換為Hex,以本案例來說BT lightpoint's data pass throught需要原始的資料
因此我們需要將uart宣告為raw => 在Linux programming時有現成的function可以使用
printf("fds[1] can read\n");
}
return 0;
由於pass throught的
資料在一般模式下會視為char轉換為Hex,以本案例來說BT lightpoint's data pass throught需要原始的資料
因此我們需要將uart宣告為raw => 在Linux programming時有現成的function可以使用
cfmakeraw => 參考
在使用時須要#include
void cfmakeraw(struct termios *termios_p);
解決方法如下 :
int res;
struct termios new_tio;
bt_fd = open(BT_DEVICE_UART, O_RDWR|O_NOCTTY|O_NDELAY);
if (bt_fd < 0)
{
printf("BT_HCI open tty node failed !\n");
return bt_fd;
}
else
{
printf("BT_HCI open tty node success !\n");
}
bzero(&new_tio,sizeof(new_tio));
new_tio.c_cflag |= (B115200|CS8|CLOCAL|CREAD);
new_tio.c_cflag &= ~(PARENB|CSTOPB);
new_tio.c_lflag &= ~(ECHO|ECHOE|ICANON|ISIG);
new_tio.c_oflag &= ~OPOST;
new_tio.c_iflag &= ~(INLCR|ICRNL);
new_tio.c_cc[VMIN] = 0;
new_tio.c_cc[VTIME] = 10;
res = tcflush(bt_fd, TCIFLUSH);
cfmakeraw(&new_tio);
if (res < 0)
{
printf("BT_HCI tcflush failed !\n");
return res;
}
else
{
printf("BT_HCI tcflush success !\n");
}
res = tcsetattr(bt_fd, TCSANOW, &new_tio);
if (res < 0)
{
printf("BT_HCI tcsetattr failed !\n");
return res;
}
else
{
printf("BT_HCI tcsetattr success !\n");
}
printf("HCI_serial_init success!!");
return bt_fd;
}
struct termios new_tio;
bt_fd = open(BT_DEVICE_UART, O_RDWR|O_NOCTTY|O_NDELAY);
if (bt_fd < 0)
{
printf("BT_HCI open tty node failed !\n");
return bt_fd;
}
else
{
printf("BT_HCI open tty node success !\n");
}
bzero(&new_tio,sizeof(new_tio));
new_tio.c_cflag |= (B115200|CS8|CLOCAL|CREAD);
new_tio.c_cflag &= ~(PARENB|CSTOPB);
new_tio.c_lflag &= ~(ECHO|ECHOE|ICANON|ISIG);
new_tio.c_oflag &= ~OPOST;
new_tio.c_iflag &= ~(INLCR|ICRNL);
new_tio.c_cc[VMIN] = 0;
new_tio.c_cc[VTIME] = 10;
res = tcflush(bt_fd, TCIFLUSH);
cfmakeraw(&new_tio);
if (res < 0)
{
printf("BT_HCI tcflush failed !\n");
return res;
}
else
{
printf("BT_HCI tcflush success !\n");
}
res = tcsetattr(bt_fd, TCSANOW, &new_tio);
if (res < 0)
{
printf("BT_HCI tcsetattr failed !\n");
return res;
}
else
{
printf("BT_HCI tcsetattr success !\n");
}
printf("HCI_serial_init success!!");
return bt_fd;
}
沒有留言:
張貼留言