發(fā)布時間:2010-10-21 閱讀量:1422 來源: 發(fā)布人:
在S3C2410上移植bluetooth(藍(lán)牙)(一)
http://www.d28365.cn/article/articleinfo/id/80007475
在S3C2410上移植bluetooth(藍(lán)牙)(二)
http://www.d28365.cn/article/articleinfo/id/80007476
最近兩天在HHARM2410-R3上移植了USB藍(lán)牙設(shè)備和BlueZ 藍(lán)牙協(xié)議棧,呵呵,藍(lán)牙果然是個很好的東西,協(xié)議棧內(nèi)容很豐富,掛上去以后可以使用很多功能。我現(xiàn)在就可以用它來接收GPS數(shù)據(jù)以及和用手機(jī)上網(wǎng)。我是在 做車載的,所以特別有用。積累了一些關(guān)于藍(lán)牙的知識,但是算是初步的,把我的經(jīng)驗(yàn)發(fā)上來,各位做過藍(lán)牙的大哥請多指導(dǎo)。
??? 先介紹一下硬件,我用的是電腦賣場里面隨便買到的USB藍(lán)牙適配器,價格在80元左右,應(yīng)該是臺產(chǎn)的,沒有牌子,像一個小一點(diǎn)的U盤。買之前叫賣家在windows下測試一下,帶一個帶藍(lán)牙的手機(jī)過去試試看,確認(rèn)能用再買。
??? linux上的藍(lán)牙協(xié)議棧有好幾個,官方的藍(lán)牙協(xié)議棧是Bluez,在www.bluez.org上能找到所有的說明文檔和源代碼。我先是在自己的pc上安裝了bluez的協(xié)議棧,然后又把它移植到了華恒HHARM2410-R3上。
(一) 在Red hat 9上安裝Bluez
?? 在pc 上的安裝我參考了O'Reilly的Linux Unwired一書,chapter 7中詳細(xì)地介紹了linux下的bluetooth的基礎(chǔ)知識、安裝、配置和使用。安裝前必須了解一下bluez的基本結(jié)構(gòu),直接位于發(fā)射傳輸協(xié)議之上的 協(xié)議是HCI(host control interface),我的手機(jī)和藍(lán)牙GPS用到的高層協(xié)議是服務(wù)發(fā)現(xiàn)協(xié)議SDP和模擬串口的協(xié)議RFCOMM,中間那一層協(xié)議是L2CAP,應(yīng)該是處理 邏輯鏈路的吧,我并不是很清楚,請參考bluez的官方文檔。
HHARM2410-R3上用到內(nèi)核版本是2.4.18,于是我在pc上安裝 bluez時也使用了2.4.18的內(nèi)核。使用bluez必須要對內(nèi)核打patch的,于是到www.kernel.org上下載了linux- 2.4.18.tar.bz2后到http://www.bluez.org/patches.html上下載針對2.4.18的patch,patch -2.4.18-mh15.gz。于是,解壓,打patch:
# tar xjvf linux-2.4.18.tar.bz2
# cd linux/
# gzip -dc ../patch-2.4.18-mh15.gz | patch -p1
注意一下這時的patch的輸出,在源代碼方面的patch是針對driver/、include/、net/目錄下的代碼的修改,并沒有修改到內(nèi)核部分的內(nèi)容,應(yīng)該沒有修改到linux核心的東西,在移植到S3C2410時應(yīng)該不會有太大的問題。
下面就是編譯內(nèi)核,在config的時候關(guān)于bluez我的配置是這樣的:
#
# Bluetooth support
#
CONFIG_BLUEZ=m
CONFIG_BLUEZ_L2CAP=m
CONFIG_BLUEZ_SCO=m
CONFIG_BLUEZ_RFCOMM=m
CONFIG_BLUEZ_RFCOMM_TTY=y
CONFIG_BLUEZ_BNEP=m
CONFIG_BLUEZ_BNEP_MC_FILTER=y
CONFIG_BLUEZ_BNEP_PROTO_FILTER=y
#
# Bluetooth device drivers
#
CONFIG_BLUEZ_HCIUSB=m
# CONFIG_BLUEZ_HCIUSB_SCO is not set
CONFIG_BLUEZ_HCIUART=m
CONFIG_BLUEZ_HCIUART_H4=m
CONFIG_BLUEZ_HCIUART_BCSP=m
# CONFIG_BLUEZ_HCIUART_BCSP_TXCRC is not set
# CONFIG_BLUEZ_HCIBFUSB is not set
CONFIG_BLUEZ_HCIDTL1=m
CONFIG_BLUEZ_HCIBT3C=m
CONFIG_BLUEZ_HCIBLUECARD=m
CONFIG_BLUEZ_HCIBTUART=m
CONFIG_BLUEZ_HCIVHCI=m
??? 供大家參考,Linux Unwired一書中有詳細(xì)的說明,注意如果使用make menuconfig,一定要打開一下.config文件看看CONFIG_BLUEZ_RFCOMM_TTY=y,不能為n或者m。還有注意 CONFIG_USB_BLUETOOTH一定不能選(在USB support下),否則會影響到bluez的運(yùn)行的。
??? 內(nèi)核編譯好了就開始準(zhǔn)備 bluez的庫和工具了。到http://www.bluez.org/download.html上 下載最新的bluez程序包,我只下載了bluez -libs-2.20.tar.gz,bluez-utils-2.20.tar.gz,bluez-pin-0.25.tar.gz三個包,分別是庫, 工具集和由bluez提供的一個pin_helper。由于在pc下,安裝的過程沒什么好說的,解壓,./configure,make,make install。
??? 然后就是注意一下默認(rèn)配置目錄/etc/bluetooth/下的hcid.conf配置文件,這是用來配置后臺daemon進(jìn)程hcid的。如果把這臺 pc機(jī)器+藍(lán)牙適配器看成是一個藍(lán)牙設(shè)備的話,進(jìn)程hcid就管理這個藍(lán)牙設(shè)備的基本配置信息,例如名稱,class,地址, feature等等。還有當(dāng)設(shè)備與其他藍(lán)牙設(shè)備Bonding/Pairing即所謂的配對時,處理PIN code的程序也是hcid,而在hcid.conf腳本中比較重要的一項(xiàng)就是pin_helper,默認(rèn)的配置是pin_helper= /usr/bin/bluepin,這個是python寫的用來讀取用戶輸入的PIN code的程序,安裝bluez-pin包的時候裝在/usr/bin下的。
這里有必要了解一下配對的過程,我感覺就是兩個設(shè)備互相通密碼建立相 互之間連接的過程。我看了hcid部分的代碼,了解的大致是這樣:比如兩個藍(lán)牙設(shè)備A和B,A先發(fā)送要求配對的請求給B,B由用戶設(shè)置好配對的密碼即 PIN code,然后回一個消息給A,說你想配對可以呀,知道我的密碼嗎?然后A就發(fā)送PIN code過去,B看和自己的密碼相符合,就發(fā)送一個replyOK的消息給A,這樣兩者就建立起來了信任關(guān)系。
在pc+藍(lán)牙適配器這個藍(lán)牙設(shè)備A 上,如果這個設(shè)備先發(fā)送配對請求給另一個遠(yuǎn)程設(shè)備B,那么當(dāng)B發(fā)送詢問密碼請求過來時,在A上運(yùn)行的hcid后臺進(jìn)程就通過一個pin_helper的程 序讀取PIN code,并發(fā)送回給B;如果遠(yuǎn)程設(shè)備B先發(fā)送配對請求給A,hcid上用作驗(yàn)證的PIN code就是/etc/bluetooth/pin的內(nèi)容,如果讀取失敗程序在啟動的時候會默認(rèn)地設(shè)置一個密碼的,代碼在bluez- utils/hcid/security.c中的init_security_data函數(shù)中,默認(rèn)的是BlueZ。為了和我的手機(jī)相配,我把它改成了 123,手機(jī)只能輸入數(shù)字。
關(guān)于其他hcid.conf的設(shè)置,請man hcid.conf。
設(shè)置好以后,換上新內(nèi)核,啟動 linux。插入USB藍(lán)牙適配器,# dmesg | tail會發(fā)現(xiàn)有usb.c: USB device 2 (vend/prod 0x1131/0x1001) is not claimed by any active driver.這個問題,不管它,只要有usb.c: registered new driver hci_usb的消息就可以,然后 # lsmod 會發(fā)現(xiàn)hci_usb的模塊被安裝了,再# modprobe rfcomm,這樣基本上所有的模塊都安裝齊了。
# hciconfig hci0 up
# hcid -f /etc/bluetooth/hcid.conf
啟動hci設(shè)備和hcid精靈進(jìn)程
# hciconfig -a
hci0:?? Type: USB
?????? BD Address: 00:11:67:0F:BB:A1 ACL MTU: 678:8 SCO MTU: 48:10
?????? UP RUNNING PSCAN ISCAN
?????? RX bytes:115 acl:0 sco:0 events:15 errors:0
?????? TX bytes:313 acl:0 sco:0 commands:15 errors:0
?????? Features: 0xff 0xff 0x8d 0x78 0x08 0x18 0x00 0x00
?????? Packet type: DM1 DM3 DM5 DH1 DH3 DH5 HV1 HV2 HV3
?????? Link policy: RSWITCH HOLD SNIFF PARK
?????? Link mode: SLAVE ACCEPT
?????? Name: 'BlueZ (0)'
?????? Class: 0x000100
?????? Service Classes: Unspecified
?????? Device Class: Computer, Uncategorized
?????? HCI Ver: 1.2 (0x2) HCI Rev: 0x1ae LMP Ver: 1.2 (0x2) LMP Subver: 0x1ae
?????? Manufacturer: Integrated System Solution Corp. (57)
可以看到目前設(shè)備的配置情況,有些是從hcid.conf中讀取的,有些是從設(shè)備中讀取的。
下面,打開手機(jī)上的藍(lán)牙,啟動藍(lán)牙GPS
# hcitool scan
Scanning ...
?????? 00:0E:07:58:1A:33?????? T628
?????? 00:08:1B:C0:D1:3C?????? HOLUX GR-231
這樣就看到了兩個設(shè)備了,我用的是索愛的T628和HOLUX的藍(lán)牙GPS,前面的一串應(yīng)該是藍(lán)牙設(shè)備唯一的地址。
#sdptool browse???????????????? 可以看到每個設(shè)備所提供的服務(wù)
Inquiring ...
Browsing 00:0E:07:58:1A:33 ...
Service Name: Dial-up Networking
Service RecHandle: 0x10000
Service Class ID List:
?"Dialup Networking" (0x1103)
?"Generic Networking" (0x1201)
Protocol Descriptor List:
?"L2CAP" (0x0100)
?"RFCOMM" (0x0003)
?? Channel: 1
Profile Descriptor List:
?"Dialup Networking" (0x1103)
?? Version: 0x0100
.............
Service Name: Serial Port 1
Service RecHandle: 0x10003
Service Class ID List:
?"Serial Port" (0x1101)
Protocol Descriptor List:
?"L2CAP" (0x0100)
?"RFCOMM" (0x0003)
?? Channel: 4
............
Service Name: OBEX Object Push
Service RecHandle: 0x10005
Service Class ID List:
?"OBEX Object Push" (0x1105)
Protocol Descriptor List:
?"L2CAP" (0x0100)
?"RFCOMM" (0x0003)
?? Channel: 10
?"OBEX" (0x0008)
Profile Descriptor List:
?"OBEX Object Push" (0x1105)
?? Version: 0x0100
?
Browsing 00:08:1B:C0:D1:3C ...
手機(jī)上綁定了很多的服務(wù),有撥號服務(wù),音頻服務(wù),串口服務(wù),文件交換服務(wù)(OBEX)...在SDP協(xié)議下,每個服務(wù)綁定到一個Channel上。GPS上沒有綁定服務(wù),它只作為虛擬串口設(shè)備來使用。
利用實(shí)用工具rfcomm可以把遵循RFCOMM的服務(wù)bind到一個類似的串口設(shè)備上。在綁定之前,必須確保/dev下有rfcomm*的設(shè)備,如果沒有,就自己建立:
# mknod -m 666 /dev/rfcommX c 216 X (X是數(shù)字)
這樣就可以綁定了,比如我需要用手機(jī)撥號上網(wǎng)的功能,看到它的Channel 1是RFCOMM的Dialup Networking功能,則:
# rfcomm bind 0 00:0E:07:58:1A:33 1
即 將00:0E:07:58:1A:33設(shè)備的Channel 1服務(wù)綁定到/dev/rfcomm0上,這樣,就相當(dāng)于建立了一個虛擬的串行連接到一個可以撥號的無線modem上了,打開minicom,設(shè)置串口為 /dev/rfcomm0,波特率19200,8N1,鍵入atz,返回OK。用ppp就可以撥號上網(wǎng)了,第一次連接時手機(jī)會彈出個輸入框問PIN code,以后就不用了。
GPS設(shè)備只是作為串口來用的,也很簡單:
# rfcomm bind 1 00:08:1B:C0:D1:3C
打開minicom設(shè)置波特率為4800就可以讀GPS數(shù)據(jù)了,大功告成!
另外,sdpd程序是本設(shè)備提供給對外的看到的服務(wù),可以通過sdptool add --channel=X SP來增加對外的服務(wù),我沒有研究過。還有對于文件傳輸OBEX和個人局域網(wǎng)BNEQ還需要繼續(xù)學(xué)習(xí)。
--同濟(jì)大學(xué)高性能計算中心 Dennis
歡迎各位發(fā)郵件給我和我討論 dennis.he.2005@gmail.com
兩腳晶振必為無源晶振,不管是插件晶振或貼片晶振
隨著科技的發(fā)展,尤其是移動設(shè)備、可穿戴技術(shù)以及物聯(lián)網(wǎng)(IoT)領(lǐng)域的崛起,智能化產(chǎn)品越來越趨向于便攜式,因此對晶振的小型化的需求也逐漸增加。
24MHz無源晶振具有多種重要作用
汽車行業(yè)正處在電動化和智能化的轉(zhuǎn)型過程中,而半導(dǎo)體企業(yè)站在這一變革的最前沿
市場對工業(yè)應(yīng)用的需求與日俱增,數(shù)據(jù)采集系統(tǒng)是其中的關(guān)鍵設(shè)備。它們通常用于檢測溫度、流量、液位、壓力和其他物理量,隨后將這些物理量對應(yīng)的模擬信號轉(zhuǎn)換為高分辨率的數(shù)字信息,再由軟件做進(jìn)一步處理。此類系統(tǒng)對精度和速度的要求越來越高,這些數(shù)據(jù)采集系統(tǒng)由放大器電路和模數(shù)轉(zhuǎn)換器(ADC)組成,其性能對系統(tǒng)具有決定性的影響。