|
From: Mattias A. <mat...@us...> - 2001-06-06 15:02:55
|
The following file was modified in apps/bluetooth/experimental:
Name Old version New version Comment
---- ----------- ----------- -------
bt_vendor.c 1.15 1.16=20=20=20=20=20=20=20=20=20=20=20=20
The accompanying log:
* Added some ps key defines
* Added csr_bcspmode() to enable/disable bcsp mode in kernel
* Added csr_pskey() used to read/write any PS key in HW
* Added csr_change_if() which switches host interface in CSR HW (BCSP<->H4)
* Added check in init_hw for CSR HW whether init went ok, if not=20
we try changing interface and retry by restarting btd.
* Always make sure that deep sleep timer is disabled in HW when=20
using BCSP
The diff of the modified file(s):
--- bt_vendor.c 2001/05/17 14:53:54 1.15
+++ bt_vendor.c 2001/06/06 15:02:54 1.16
@@ -45,7 +45,10 @@
#include <termios.h>
#include <syslog.h>
#include <sys/ioctl.h>
+#include <sys/types.h>
+#include <signal.h>
#include <string.h>
+#include <stdlib.h>
=20
#include "bt_misc.h"
#include "bt_vendor.h"
@@ -188,6 +191,13 @@
/* CSR specific commands */
/* =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D*/
=20
+#define PSKEY_HOSTIO_UART_PS_BLOCK 0x0191
+#define PSKEY_HOST_INTERFACE 0x01f9
+#define PSKEY_UART_SLEEP_TIMEOUT 0x0222
+#define CSR_PSKEY_GETREQ 0x0
+#define CSR_PSKEY_SETREQ 0x2
+
+
/* Set the phys device to CSR default, 115200 */=20
void
csr_init_phys(int fd)
@@ -199,6 +209,189 @@
fd_setup(fd, 115200, USE_FLOW_CTRL, USE_BCSP);
}
=20
+void
+csr_bcspmode(int bt_cfd, int enable)
+{
+ if (ioctl(bt_cfd, BTSETBCSPMODE, &enable) < 0)
+ {
+ perror(__FUNCTION__);
+ exit(1);
+ }
+}
+
+
+/*
+ * Read/Write any PS key in CSR module=20
+ * ps_vals holds return values / set params depending on=20
+ * type of operation
+ */
+
+void csr_pskey(int bt_cfd, unsigned short ps_key, unsigned short rw_mode,=
=20
+ unsigned short *ps_vals, unsigned short n_pars)
+{
+ unsigned short msg[CSR_PSKEY_MAXPARAMS + CSR_PSKEY_MSGHDR_SIZE];
+
+ syslog(LOG_INFO ,": ps_key 0x%x rw_mode : %d\n", ps_key, rw_mode);
+
+ msg[0] =3D ps_key;
+ msg[1] =3D rw_mode;
+ msg[2] =3D n_pars;
+
+ if (n_pars > CSR_PSKEY_MAXPARAMS)
+ {
+ syslog(LOG_INFO, "error : max nbr pskey params is %d [%d]\n",=20
+ CSR_PSKEY_MAXPARAMS, n_pars);
+ return;
+ }
+=20=20
+ if (rw_mode =3D=3D CSR_PSKEY_GETREQ)
+ memset(&msg[CSR_PSKEY_MSGHDR_SIZE], 0, n_pars*2); /* GETREQ */
+ else
+ memcpy(&msg[CSR_PSKEY_MSGHDR_SIZE], ps_vals, n_pars*2);=20=20=20=20
+=20=20
+ if (ioctl(bt_cfd, BT_CSR_PSKEY, msg) < 0)
+ {
+ perror(__FUNCTION__);
+ exit(1);
+ }
+
+ /* Copy back return params if READ (skip message header) */
+ if (rw_mode =3D=3D CSR_PSKEY_GETREQ)
+ memcpy(ps_vals, &msg[CSR_PSKEY_MSGHDR_SIZE], n_pars*2);
+}
+
+/*=20
+ * Switches host interface in CSR HW (H4<->BCSP)=20
+ */
+
+void csr_change_if(int bt_cfd, int phys_fd, int spd)
+{
+ static int did_restart =3D 0; /* only try once */
+ unsigned short ps_parbuf[10];
+=20=20
+ if (did_restart)
+ return;
+
+ shutdown_stack(bt_cfd);
+ sleep(1);
+=20=20
+ if (hw_vendor() =3D=3D HW_CSR_H4)
+ {
+ syslog(LOG_INFO, "Changing CSR host IF BCSP -> H4");
+=20=20=20=20
+ /* Temporarily set stack to use BCSP framing */
+ csr_bcspmode(bt_cfd, 1);
+=20=20=20=20
+ /* Setup serial port for BCSP (default baudrate) */
+ fd_setup(phys_fd, 115200, USE_FLOW_CTRL, USE_BCSP);
+ reset_hw();
+
+ if (ioctl(bt_cfd, BTINITBCSP) < 0)
+ {
+ perror(__FUNCTION__);
+ exit(1);
+ }
+=20=20=20=20
+ sleep(1);
+
+ /* Make sure that deep sleep timer is disabled to=20
+ prevent problems when setting new ps keys */
+ csr_pskey(bt_cfd, PSKEY_UART_SLEEP_TIMEOUT,=20
+ CSR_PSKEY_GETREQ, ps_parbuf, 1);
+=20=20=20=20
+ if (ps_parbuf[0] !=3D 0)
+ {
+ syslog(LOG_INFO, "Disabling deep sleep timer");
+ ps_parbuf[0] =3D 0; /* disable deep sleep timer */
+ csr_pskey(bt_cfd, PSKEY_UART_SLEEP_TIMEOUT,=20
+ CSR_PSKEY_SETREQ, ps_parbuf, 1);
+ reset_hw();
+
+ if (ioctl(bt_cfd, BTINITBCSP) < 0)
+ {
+ perror(__FUNCTION__);
+ exit(1);
+ }
+ sleep(1);
+ }
+=20=20=20=20
+ /* Read params for ps key PSKEY_HOSTIO_UART_PS_BLOCK */
+ csr_pskey(bt_cfd, PSKEY_HOSTIO_UART_PS_BLOCK,=20
+ CSR_PSKEY_GETREQ, ps_parbuf, 10);
+
+ if (ps_parbuf[1] =3D=3D 6) /* BCSP */
+ {
+ /* Set UART to no parity, non-bcsp, flow control on */
+ ps_parbuf[1] =3D 0x00a8;
+ csr_pskey(bt_cfd, PSKEY_HOSTIO_UART_PS_BLOCK,=20
+ CSR_PSKEY_SETREQ, ps_parbuf, 10);
+
+ sleep(1);
+=20
+ /* Set ps key PSKEY_HOST_INTERFACE */
+ ps_parbuf[0] =3D 0x0003; /* H4 */
+ csr_pskey(bt_cfd, PSKEY_HOST_INTERFACE,=20
+ CSR_PSKEY_SETREQ, ps_parbuf, 1);
+ sleep(1);
+ }
+ else
+ {
+ syslog(LOG_ERR, __FUNCTION__": PS key parameter unknown [%d]", ps_pa=
rbuf[1]);
+ }=20=20=20
+=20=20=20=20
+ /* Set back stack to use H4 framing */
+ csr_bcspmode(bt_cfd, 0);
+ }
+ else
+ {
+ syslog(LOG_INFO, "Changing CSR host IF BCSP -> H4");
+
+ /* Set stack to use H4 temporarily */=20=20=20=20=20=20=20=20
+ csr_bcspmode(bt_cfd, 0);
+=20=20=20=20
+ /* Setup serial port for H4 (default baudrate) */
+ fd_setup(phys_fd, 115200, USE_FLOW_CTRL, DONT_USE_BCSP);
+
+ reset_hw();=20=20=20=20
+ sleep(1);
+
+ /* Initialize stack */
+ init_stack(bt_cfd, spd);
+
+ /* Read params for ps key PSKEY_HOSTIO_UART_PS_BLOCK */
+ csr_pskey(bt_cfd, PSKEY_HOSTIO_UART_PS_BLOCK,=20
+ CSR_PSKEY_GETREQ, ps_parbuf, 10);
+
+ if (ps_parbuf[1] =3D=3D 0xa8) /* non-BCSP */
+ {
+ /* Enable parity bit, disable flow */
+ ps_parbuf[1] =3D 0x6;
+ csr_pskey(bt_cfd, PSKEY_HOSTIO_UART_PS_BLOCK,=20
+ CSR_PSKEY_SETREQ, ps_parbuf, 10);
+ sleep(1);
+=20=20=20=20=20
+ /* Set ps key PSKEY_HOST_INTERFACE */
+ ps_parbuf[0] =3D 0x1; /* BCSP */
+ csr_pskey(bt_cfd, PSKEY_HOST_INTERFACE,=20
+ CSR_PSKEY_SETREQ, ps_parbuf, 1);
+
+ /* Should not be needed if hw_vendor is changed in kernel ....*/
+=20=20=20=20=20=20
+ /* Set back stack to use BCSP framing */
+ csr_bcspmode(bt_cfd, 1);
+ }=20
+ else
+ {
+ syslog(LOG_ERR, __FUNCTION__": PS key parameter unknown [%d]", ps_pa=
rbuf[1]);
+ }
+ }
+
+ did_restart =3D 1; /* Only try once */
+
+ /* Restart btd */
+ kill(getpid(), 10);
+}
+
/* fixme -- remove hardcoded values */
void
csr_init_hw(int bt_cfd, int phys_fd, int spd)
@@ -206,7 +399,40 @@
/* Connection setup, all devices, no auto accept */
unsigned char filter[3] =3D { 0x02, 0x00, 0x01 };
unsigned int wrscan =3D (PAGE_SCAN_ENABLE | INQUIRY_SCAN_ENABLE);
+ unsigned char bd[6];
+=20=20
+ /* Now test whether stack initialized ok
+ Try reading local BD address */
=20
+ read_local_bd(bt_cfd, bd);
+=20=20
+ if ((bd[0] =3D=3D 0) && (bd[1] =3D=3D 0) &&=20
+ (bd[2] =3D=3D 0) && (bd[3] =3D=3D 0) &&
+ (bd[4] =3D=3D 0) && (bd[5] =3D=3D 0))
+ {
+ syslog(LOG_INFO, "Stack failed to initialize, try changing interface");
+ csr_change_if(bt_cfd, phys_fd, spd);
+ }
+
+ if (hw_vendor() =3D=3D HW_CSR_BCSP)
+ {
+ unsigned short ps_parbuf;
+ /* Make sure uart deep sleep is disabled when using BCSP */
+ csr_pskey(bt_cfd, PSKEY_UART_SLEEP_TIMEOUT,=20
+ CSR_PSKEY_GETREQ, &ps_parbuf, 1);
+=20=20=20=20
+ if (ps_parbuf !=3D 0)
+ {
+ syslog(LOG_INFO, "Disabling deep sleep timer");
+ ps_parbuf =3D 0; /* disable deep sleep timer */
+ csr_pskey(bt_cfd, PSKEY_UART_SLEEP_TIMEOUT,=20
+ CSR_PSKEY_SETREQ, &ps_parbuf, 1);
+=20=20=20=20=20=20
+ /* Restart btd */
+ kill(getpid(), 10);
+ }
+ }
+=20=20
syslog(LOG_INFO, "Setting write_scan_enable in CSR module!\n");
=20
bt_write_scan_enable(bt_cfd, wrscan);
@@ -216,8 +442,6 @@
=20
bt_write_pagescan_activity(bt_cfd, 0x0800, 0x12);
=20
- sleep(1);
-
bt_set_event_filter(bt_cfd, filter);
=20
syslog(LOG_INFO, "Setting baudrate in CSR module!\n");=20=20
|