Skip to content

Commit 8b68f9d

Browse files
wangzhi7xiaoxiang781216
authored andcommitted
[bt_uart.c] fix bug:cant receive data
rootcause: in btuart_rxwork, read data in blocking mode and btuart_read do three times, maybe remote send some packets one time,so it wont read the sencond packets. Signed-off-by: wangzhi7 <[email protected]>
1 parent 31605b6 commit 8b68f9d

File tree

4 files changed

+60
-68
lines changed

4 files changed

+60
-68
lines changed

drivers/wireless/bluetooth/Kconfig

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ config BLUETOOTH_UART_GENERIC
2424
default n
2525

2626
config BLUETOOTH_UART_SHIM
27-
bool
27+
bool "Bluetooth UART SHIM driver"
2828
default n
2929

3030
if BLUETOOTH_UART

drivers/wireless/bluetooth/bt_uart.c

Lines changed: 58 additions & 65 deletions
Original file line numberDiff line numberDiff line change
@@ -121,71 +121,69 @@ static void btuart_rxwork(FAR void *arg)
121121
* Read the first byte to get the packet type.
122122
*/
123123

124-
nread = btuart_read(upper, data, H4_HEADER_SIZE, 0);
125-
if (nread != H4_HEADER_SIZE)
124+
while (true)
126125
{
127-
wlwarn("WARNING: Unable to read H4 packet type: %zd\n", nread);
128-
goto errout_with_busy;
129-
}
126+
nread = btuart_read(upper, data, H4_HEADER_SIZE, 0);
127+
if (nread != H4_HEADER_SIZE)
128+
{
129+
wlwarn("WARNING: Unable to read H4 packet type: %zd\n", nread);
130+
break;
131+
}
130132

131-
if (data[0] == H4_EVT)
132-
{
133-
hdrlen = sizeof(struct bt_hci_evt_hdr_s);
134-
}
135-
else if (data[0] == H4_ACL)
136-
{
137-
hdrlen = sizeof(struct bt_hci_acl_hdr_s);
138-
}
139-
else
140-
{
141-
wlerr("ERROR: Unknown H4 type %u\n", data[0]);
142-
goto errout_with_busy;
143-
}
133+
if (data[0] == H4_EVT)
134+
{
135+
hdrlen = sizeof(struct bt_hci_evt_hdr_s);
136+
}
137+
else if (data[0] == H4_ACL)
138+
{
139+
hdrlen = sizeof(struct bt_hci_acl_hdr_s);
140+
}
141+
else
142+
{
143+
wlerr("ERROR: Unknown H4 type %u\n", data[0]);
144+
break;
145+
}
144146

145-
nread = btuart_read(upper, data + H4_HEADER_SIZE,
146-
hdrlen, hdrlen);
147-
if (nread != hdrlen)
148-
{
149-
wlwarn("WARNING: Unable to read H4 packet header: %zd\n", nread);
150-
goto errout_with_busy;
151-
}
147+
nread = btuart_read(upper, data + H4_HEADER_SIZE,
148+
hdrlen, hdrlen);
149+
if (nread != hdrlen)
150+
{
151+
wlwarn("WARNING: Unable to read H4 packet header: %zd\n", nread);
152+
break;
153+
}
152154

153-
hdr = (FAR void *)(data + H4_HEADER_SIZE);
155+
hdr = (FAR void *)(data + H4_HEADER_SIZE);
154156

155-
if (data[0] == H4_EVT)
156-
{
157-
pktlen = hdr->evt.len;
158-
type = BT_EVT;
159-
}
160-
else if (data[0] == H4_ACL)
161-
{
162-
pktlen = hdr->acl.len;
163-
type = BT_ACL_IN;
164-
}
165-
else
166-
{
167-
wlerr("ERROR: Unknown H4 type %u\n", data[0]);
168-
goto errout_with_busy;
169-
}
170-
171-
nread = btuart_read(upper, data + H4_HEADER_SIZE + hdrlen,
172-
pktlen, pktlen);
173-
if (nread != pktlen)
174-
{
175-
wlwarn("WARNING: Unable to read H4 packet: %zd\n", nread);
176-
goto errout_with_busy;
177-
}
157+
if (data[0] == H4_EVT)
158+
{
159+
pktlen = hdr->evt.len;
160+
type = BT_EVT;
161+
}
162+
else if (data[0] == H4_ACL)
163+
{
164+
pktlen = hdr->acl.len;
165+
type = BT_ACL_IN;
166+
}
167+
else
168+
{
169+
wlerr("ERROR: Unknown H4 type %u\n", data[0]);
170+
break;
171+
}
178172

179-
/* Pass buffer to the stack */
173+
nread = btuart_read(upper, data + H4_HEADER_SIZE + hdrlen,
174+
pktlen, pktlen);
175+
if (nread != pktlen)
176+
{
177+
wlwarn("WARNING: Unable to read H4 packet: %zd\n", nread);
178+
break;
179+
}
180180

181-
BT_DUMP("Received", data, H4_HEADER_SIZE + hdrlen + pktlen);
182-
upper->busy = false;
183-
bt_netdev_receive(&upper->dev, type, data + H4_HEADER_SIZE,
184-
hdrlen + pktlen);
185-
return;
181+
/* Pass buffer to the stack */
186182

187-
errout_with_busy:
188-
upper->busy = false;
183+
BT_DUMP("Received", data, H4_HEADER_SIZE + hdrlen + pktlen);
184+
bt_netdev_receive(&upper->dev, type, data + H4_HEADER_SIZE,
185+
hdrlen + pktlen);
186+
}
189187
}
190188

191189
static void btuart_rxcallback(FAR const struct btuart_lowerhalf_s *lower,
@@ -196,15 +194,10 @@ static void btuart_rxcallback(FAR const struct btuart_lowerhalf_s *lower,
196194
DEBUGASSERT(lower != NULL && arg != NULL);
197195
upper = (FAR struct btuart_upperhalf_s *)arg;
198196

199-
if (!upper->busy)
197+
int ret = work_queue(HPWORK, &upper->work, btuart_rxwork, arg, 0);
198+
if (ret < 0)
200199
{
201-
upper->busy = true;
202-
int ret = work_queue(HPWORK, &upper->work, btuart_rxwork, arg, 0);
203-
if (ret < 0)
204-
{
205-
upper->busy = false;
206-
wlerr("ERROR: work_queue failed: %d\n", ret);
207-
}
200+
wlerr("ERROR: work_queue failed: %d\n", ret);
208201
}
209202
}
210203

drivers/wireless/bluetooth/bt_uart.h

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -78,7 +78,6 @@ struct btuart_upperhalf_s
7878
/* Work queue support */
7979

8080
struct work_s work;
81-
volatile bool busy;
8281
};
8382

8483
/****************************************************************************

drivers/wireless/bluetooth/bt_uart_shim.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -359,7 +359,7 @@ FAR struct btuart_lowerhalf_s *btuart_shim_getdevice(FAR const char *path)
359359

360360
s = &n->state;
361361

362-
ret = file_open(&s->f, path, O_RDWR | O_CLOEXEC);
362+
ret = file_open(&s->f, path, O_RDWR | O_CLOEXEC | O_NONBLOCK);
363363
if (ret < 0)
364364
{
365365
kmm_free(n);

0 commit comments

Comments
 (0)