bluetooth driver in Android2.3
使用高通芯片,linux2.6.35.7
board-vital2.c初始化蓝牙GPIO,bt_gpio_table中配置GPIO。设置了UART1的RTS,CTS,TX,RX引脚和蓝牙模块的RESET,SHUTDOWN,WAKE,HOST_WAKE引脚,bcm_bt_lpm_device变量将被注册到platform_device,设置WAKE,HOST_WAKE两个引脚的触发函数。
bcm_bt_lpm.c动态设置GPIO,实现broadcom
android/external/bluetooth/bluez/tools目录实现了bluez上下层通讯的模块
bccmd----Utility for the CSR BCCMD interface。bccmd.c中有很多command,一部分命令式对PSKEY的管理。transport_write通过串口发送命令给蓝牙模
块。transport_read通过串口读取蓝牙模块参数。transport_open/transport_close函数控制设备的开关/dev/ttyS*
hciattach.c---HCI UART driver initialization utility。初始化UART1,然后不断poll。初始化uart1时,调用TIOCSETD,设置N_HCI的line discipline 到hci_ldisc。之后调用HCIUARTSETFLAGS,设置Uart的流控方式。之后调用HCIUARTSETPROTO,进入hci_uart_set_proto(),设置HCI的ldisc到hci_uart。> 最后注册hci_uart到hci的devices,hci_dev_list,向tasklit中注册hci_cmd_task,hci_rx_task,hci_tx_task。最后向rfkill注册RFKILL_TYPE_BLUETOO TH。
hci_ldisc.c向tty注册hci_uart设备。初始化h4和ibs。
hci_h4.c向hci_uart注册hci_h4。
ttydriver->uart->msm_serial->hci_ldisc->hci_h4->hci_core->l2cap
数据的接收流程:
1,uart口取得蓝牙模块的数据。代码中使用msm_serial.c/msm_serial_hs.c(DMA)/msm_serial_hs_lite.c。通过msm_startup()注册了msm_irq中断获取数据。然后通过handle_rx()向tty写数据。之后调> 用tty_flip_buffer_push()-->flush_to_ldisc()中的disc->ops->receive_buf()将数据发给ldisc。
2,uart口通过ldisc传数据给hci_uart。在hci_ldisc.c中调用hci_uart_tty_receive()函数。
3,hci_uart传给其上的hci_h4。hci_uart.c中通过hu->proto->recv()向hci_h4层发送数据。
4,hci_h4传给hci层。h4_recv()-->hci_recv_frame()调用tasklet_schedule(&hdev->rx_task),该rx_task对应hci_rx_task(),其中会分成socket,even t,acl,sco四类数据分发。
5,hci层对四类数据进行处理,acl会传给l2cap层。
6,l2cap层再通过socket传给rfcomm层。
可参见http://blog.chinaunix.net/uid-741742-id-359310.html