<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          EEPW首頁 > 手機(jī)與無線通信 > 設(shè)計(jì)應(yīng)用 > 嵌入式藍(lán)牙PSTN語音接入點(diǎn)的設(shè)計(jì)與實(shí)現(xiàn)

          嵌入式藍(lán)牙PSTN語音接入點(diǎn)的設(shè)計(jì)與實(shí)現(xiàn)

          ——
          作者: 時(shí)間:2006-10-31 來源:EDN電子設(shè)計(jì)技術(shù) 收藏
          引言

          源碼開放的μClinux由于其強(qiáng)大的功能和較低的成本,得到了廣泛的應(yīng)用。嵌入式公共交換電話(Public Switched Telephone Network)語音接入點(diǎn),就是我們和廣東省電信科學(xué)研究院合作,在μClinux系統(tǒng)上開發(fā)的一種具有廣闊前景的應(yīng)用。其應(yīng)用場(chǎng)景如圖1所示。

          GSM雙模手機(jī)在進(jìn)入語音接入點(diǎn)的信號(hào)覆蓋范圍后,即自動(dòng)通過接入點(diǎn)在上登記,這樣用戶的話務(wù)就被轉(zhuǎn)移到PSTN網(wǎng)絡(luò),使用時(shí)只需繳納固定電話費(fèi);網(wǎng)關(guān)具有小型交換機(jī)的功能,可以為多個(gè)藍(lán)牙手機(jī)提供類似的服務(wù);而且同一個(gè)接入點(diǎn)信號(hào)覆蓋范圍之內(nèi)的藍(lán)牙手機(jī)間,還可以不經(jīng)過PSTN直接進(jìn)行相互間通話,就像對(duì)講機(jī)一樣,不用付費(fèi)。本文主要介紹接入點(diǎn)軟硬件以及設(shè)備驅(qū)動(dòng)程序的設(shè)計(jì)與實(shí)現(xiàn)。

          1 硬件的設(shè)計(jì)與實(shí)現(xiàn)

          嵌入式藍(lán)牙PSTN語音接入點(diǎn)的硬件系統(tǒng)框圖如圖2所示。整個(gè)接入點(diǎn)主要由網(wǎng)關(guān)控制模塊、電話線路接口模塊和藍(lán)牙收發(fā)模塊組成。

          1.1 網(wǎng)關(guān)控制模塊

          網(wǎng)關(guān)控制模塊是整個(gè)網(wǎng)關(guān)軟件的運(yùn)行平臺(tái)。ΜClinux操作系統(tǒng)運(yùn)行于此硬件平臺(tái)之上,而所有應(yīng)用軟件又運(yùn)行于操作系統(tǒng)之上。復(fù)雜的控制流程以及大量的外擴(kuò)模塊要求MPU具有較強(qiáng)的處理能力。經(jīng)多方權(quán)衡,本設(shè)計(jì)最終選用了Motorola公司的ColdFire嵌入式處理器MCF5272。

          MCF5272內(nèi)部的SRAM和ROM對(duì)于運(yùn)行μClinux操作系統(tǒng)是遠(yuǎn)遠(yuǎn)不夠的。本設(shè)計(jì)對(duì)MCF5272的RAM和ROM進(jìn)行了擴(kuò)充,外擴(kuò)了16MB的SDRAM和4MB的Flash ROM。這樣的存儲(chǔ)器配置不僅滿足了語音接入點(diǎn)軟件的需要,還為網(wǎng)關(guān)增加各種功能留有較多的余地。

          1.2 電話線路接口模塊

          電話線路接口模塊是網(wǎng)關(guān)和PSTN的接口,由線路切換繼電器、電話線接口芯片、DTMF接收電路、DTMF發(fā)送電路和FSK解調(diào)及振鈴接收電路組成。它通過MCF5272的12根GPIO線和4個(gè)外部中斷線和網(wǎng)關(guān)控制模塊相連。線路切換繼電器用于實(shí)現(xiàn)電話線上的信號(hào)在振鈴接收電路和語音電路之間的切換,即實(shí)現(xiàn)摘機(jī)掛機(jī)的功能。在待機(jī)狀態(tài)下繼電器觸點(diǎn)切換在振鈴接收電路一側(cè),等待接收振鈴信號(hào)。當(dāng)需要摘機(jī)時(shí),MCF5272控制繼電器切換到話音電路一側(cè)。

          電話線路接口芯片選用Philips公司的TEA1062A。TEA1062A把電話線上送來的模擬語音信號(hào)放大后發(fā)送到藍(lán)牙收到模塊的PCM編解碼器;相反,也把PCM編解碼器送來的語音信號(hào)放大后,放到電話線上傳輸。此外,它還提供了消側(cè)音、自動(dòng)增益控制等功能。

          網(wǎng)關(guān)還需具備轉(zhuǎn)發(fā)來電顯示信息的功能。常見的來電顯示標(biāo)準(zhǔn)分為DTMF和FSK兩種。我國(guó)的來電顯示國(guó)家標(biāo)準(zhǔn)是FSK制式的,大部分PSTN交換機(jī)也支持FSK標(biāo)準(zhǔn)的來電顯示信息;但是也有少量PSTN交換機(jī)和一些用戶內(nèi)部交換機(jī)發(fā)送的是DTMF標(biāo)準(zhǔn)的來電顯示信息。我們HOLTEK的HT9170D以及HT9032C芯片分別接收DTMF及FSK來電顯示信息。

          網(wǎng)關(guān)向PSTN交換機(jī)撥號(hào)和普通的電話一樣,采用DTMF信號(hào),同時(shí)也可以用DTMF信號(hào)向PSTN交換機(jī)發(fā)送一些信令信息。網(wǎng)關(guān)的DTMF發(fā)送選用FOLTEK的HT9200A芯片。

          1.3 藍(lán)牙收發(fā)模塊

          藍(lán)牙收發(fā)模塊包括藍(lán)牙射頻電路、基帶處理電路和PCM編解碼電路,通過MCF5272的UART1和網(wǎng)關(guān)控制模塊相連。語音信號(hào)通過PCM編解碼器MC145483和電話接口芯片TEA1062A連接。語音信號(hào)通過PCM編解碼器MC145483和電話接口芯片TEA1062A連接。MCF5272把藍(lán)牙模塊接收到的數(shù)據(jù)通過協(xié)議棧解釋為摘機(jī)、掛機(jī)、撥號(hào)、來電顯示等命令,并通過數(shù)據(jù)線控制電話語音接收與撥叫電路的各種操作。PSTN市話網(wǎng)用戶線與電話線路接口模塊連接,電話線路接口模塊把外部PSTN電話網(wǎng)的振鈴信號(hào)和來電顯示信息通過數(shù)據(jù)線傳遞給MCF5272。MCF5272再把這些信號(hào)通過藍(lán)牙軟件棧打成數(shù)據(jù)包并送給藍(lán)牙模塊,由藍(lán)牙模塊通過信道發(fā)送給終端。電話線上的模擬語音信息通過PCM編解碼器編碼后經(jīng)藍(lán)牙模塊發(fā)送給終端,同時(shí)藍(lán)牙模塊接收終端發(fā)送過來的語音數(shù)據(jù),經(jīng)過PCM編解碼器解碼,形成模擬語音信號(hào),通過電話接口芯發(fā)送到電話線上。本設(shè)計(jì)中的藍(lán)牙基帶和射頻電路由CSR的BlueCore01b芯片加上功放、低噪放、收發(fā)切換開關(guān)、濾波器和一些外圍電路組成。

          2 驅(qū)動(dòng)程序的設(shè)計(jì)與實(shí)現(xiàn)

          2.1 μClinux設(shè)備驅(qū)動(dòng)程序概述

          在μClinux下,所有的硬件設(shè)備都被視為文件,從設(shè)備接收輸入數(shù)據(jù)和將輸出送到設(shè)備就像從普通文件接收輸入和將輸出送到文件一樣,可以使用read()、write()等系統(tǒng)調(diào)用。應(yīng)用程序通過系統(tǒng)調(diào)用和內(nèi)核交互,而內(nèi)核則通過設(shè)備驅(qū)動(dòng)程序和具體硬件交互,如圖3所示。一般來說,操作系統(tǒng)內(nèi)核需要訪問三類主要設(shè)備:字符型設(shè)備、塊型設(shè)備以及網(wǎng)絡(luò)設(shè)備。本接入點(diǎn)的驅(qū)動(dòng)程序?qū)儆谧址O(shè)備驅(qū)動(dòng)程序。

          每個(gè)驅(qū)動(dòng)都有一個(gè)稱為file_operations的數(shù)據(jù)結(jié)構(gòu),包含指向驅(qū)動(dòng)程序內(nèi)部大多數(shù)函數(shù)的指針。當(dāng)系統(tǒng)引導(dǎo)時(shí),驅(qū)動(dòng)程序初始化函數(shù)將file_operations結(jié)構(gòu)的指針?biāo)徒o內(nèi)核,內(nèi)核就可以通過該指針訪問驅(qū)動(dòng)程序內(nèi)的函數(shù)。因而,這些函數(shù)就是進(jìn)入驅(qū)動(dòng)程序的基本入口點(diǎn)。當(dāng)用戶程序執(zhí)行系統(tǒng)調(diào)用時(shí),將導(dǎo)致驅(qū)動(dòng)程序內(nèi)相應(yīng)的函數(shù)被調(diào)用。

          2.2 需求分析

          嵌入式藍(lán)牙PSTN語音接入點(diǎn)的硬件設(shè)計(jì)中,電話線路接口模塊、藍(lán)牙收發(fā)模塊是外擴(kuò)的模塊,需要在μClinux內(nèi)核為基提供支持。

          藍(lán)牙收發(fā)模塊通過MCF5272的串口2和網(wǎng)關(guān)控制模塊相連,因而直接使用μClinux自帶的串口驅(qū)動(dòng)程序就可以完成對(duì)此模塊的控制;而電話線路接口模塊通過GPIO口以及外部中斷線與網(wǎng)關(guān)控制模塊相連,必須由我們自由提供驅(qū)動(dòng)程序。

          2.3 FSK來電顯示芯片驅(qū)動(dòng)的設(shè)計(jì)與實(shí)現(xiàn)

          FSK來電顯示驅(qū)動(dòng)的主要任務(wù)就是完成FSK來電顯示信息的接收,總工作流程如圖4所示。其主要功能由設(shè)備驅(qū)動(dòng)程序基本入口點(diǎn)中的open、release、read、ioctl、select函數(shù),以及設(shè)備初始化函數(shù)、中斷處理函數(shù)、下半部分處理函數(shù)、定時(shí)器超時(shí)處理函數(shù)完成。下面對(duì)其中一些關(guān)鍵的函數(shù)進(jìn)行簡(jiǎn)要介紹。

          1)read函數(shù)

          read、write稱為對(duì)設(shè)備的I/O操作。當(dāng)用戶進(jìn)程對(duì)設(shè)備執(zhí)行I/O操作時(shí),設(shè)備可能并不具備進(jìn)行I/O操作的條件。這些情況下,用戶進(jìn)程可以選擇繼續(xù)等待,即通過interruptible_sleep_on()函數(shù)讓用戶進(jìn)程進(jìn)入睡眠狀態(tài);也可以選擇不等待,立即返回。這就產(chǎn)生一兩種類型的I/O操作,即阻塞型I/O和非阻塞型I/O。我們的驅(qū)動(dòng)同時(shí)支持阻塞型和非阻塞型的讀操作。

          (2)ioctl函數(shù)

          設(shè)備特殊文件之所以特殊就是因?yàn)樗硪粋€(gè)設(shè)備,可以通過它對(duì)設(shè)備的屬性進(jìn)行設(shè)置,這和對(duì)設(shè)備的I/O操作不同。我們通過ioct1函數(shù)來實(shí)現(xiàn),ioct1的實(shí)質(zhì)就是向設(shè)備發(fā)送命令來改變?cè)O(shè)備的屬性。在實(shí)現(xiàn)此驅(qū)動(dòng)的過程中發(fā)現(xiàn),F(xiàn)SK來電顯示芯片在沒有真正的FSK數(shù)據(jù)的時(shí)候也會(huì)受到干擾,使數(shù)據(jù)線上有電平的跳動(dòng),從而產(chǎn)生不應(yīng)該產(chǎn)生的中斷對(duì)系統(tǒng)的性能造成影響,因而提供了2個(gè)ioct1命令給用戶進(jìn)程,來控制FSK中斷的打開與關(guān)閉。

          (3)select函數(shù)

          為了使用戶進(jìn)程可以使用I/O多路轉(zhuǎn)接技術(shù),在驅(qū)動(dòng)程序中實(shí)現(xiàn)了select函數(shù)。當(dāng)用戶進(jìn)程執(zhí)行select系統(tǒng)調(diào)用的時(shí)候,每一個(gè)加入select測(cè)試集合的設(shè)備的select函數(shù)都被調(diào)用,如果其中任何一個(gè)或多個(gè)設(shè)備可以進(jìn)行要求的I/O操作,則select返回;否則,通過select_wait()函數(shù)讓用戶進(jìn)程進(jìn)入睡眠狀態(tài),直到有任何一個(gè)設(shè)備可以進(jìn)行要求的I/O操作或超時(shí)為止。

          (4)中斷處理函數(shù)及下半部分處理函數(shù)

          FSK來電顯示芯片只有1根數(shù)據(jù)線連接到CPU的GPIO口上。這根數(shù)據(jù)線的每一字節(jié)數(shù)據(jù)都以0開始、以1結(jié)束,中間是8位的ASCII碼,最低位最先發(fā)送,在沒有數(shù)的時(shí)候數(shù)據(jù)線一直保護(hù)高電平。由于FSK來電顯示數(shù)據(jù)具有這種特殊的格式,把這根數(shù)據(jù)線同時(shí)接到CPU的外部中斷線上,并設(shè)置為下降沿觸發(fā),這樣每來1字節(jié)數(shù)據(jù)就會(huì)產(chǎn)生一次中斷。FSK數(shù)據(jù)幀由若干字節(jié)這樣的數(shù)據(jù)組成。FSK數(shù)據(jù)速率是1.2kb/s,因而1個(gè)bit延續(xù)約0.83ms。這樣收一個(gè)字節(jié)的數(shù)據(jù)就需要耗費(fèi)約8.3ms的時(shí)間。顯然在中斷處理程序里面接收數(shù)據(jù)是不合適的,所以在中斷處理程序中只調(diào)用mark_up函數(shù)標(biāo)記數(shù)據(jù)的到來,而把接收及處理數(shù)據(jù)的任務(wù)留到下半部分程序中完成。

          下半部分程序負(fù)責(zé)接收1字節(jié)的FSK來電顯示數(shù)據(jù),由于1字節(jié)數(shù)據(jù)中可能有多個(gè)下降延,所以在進(jìn)入處理函數(shù)后首先要關(guān)閉FSK中斷,然后每0.83ms讀一次GPIO口,接收一位的數(shù)據(jù),收完1字節(jié)數(shù)據(jù)后要打開FSK中斷,以接收下一字節(jié)的數(shù)據(jù)。

          根據(jù)本次FSK中斷是否為此次通信的每一個(gè)中斷,可以判斷本次接收的是否為FSK數(shù)據(jù)幀的第一個(gè)字節(jié),如果是,那么將啟動(dòng)一個(gè)內(nèi)核定時(shí)器,其超時(shí)時(shí)間設(shè)為1s(因?yàn)橐粋€(gè)FSK數(shù)據(jù)幀的傳輸時(shí)間不會(huì)超過1s)。在定時(shí)器超時(shí)后,內(nèi)核將調(diào)用定時(shí)器超過時(shí)處理函數(shù),提取出主叫用戶的電話號(hào)碼,并通過wake_up函數(shù)喚醒任何等待讀此設(shè)備的用戶進(jìn)程。

          2.4 DTMF語音撥號(hào)、來電顯示驅(qū)動(dòng)的設(shè)計(jì)與實(shí)現(xiàn)

          由于DTMF芯片要提供雙音多頻撥號(hào)的功能,所以與FSK芯片驅(qū)動(dòng)相比,DTMF芯片驅(qū)動(dòng)中多了一個(gè)write函數(shù)。DTMF芯片的多音多頻撥號(hào)部分有2根線和CPU相連:1根數(shù)據(jù)線、1根時(shí)鐘線。Write函數(shù)實(shí)際上就是根據(jù)芯片的寫時(shí)序把用戶進(jìn)程發(fā)來的數(shù)據(jù)傳送到芯片上去。

          相比于FSK來電顯示信息的接收而言,DTMF來電顯示信息的接收就比較容易了。DTMF來電顯示芯片提供了1根中斷信號(hào)線和4根并行數(shù)據(jù)線,每次中斷來只需要讀并行信號(hào)線,并進(jìn)行簡(jiǎn)單的解碼、緩存工作就可以了。此外為了方便,把摘、掛機(jī),抬高、拉低靜音等命令者包含此驅(qū)動(dòng)的iotcl命令集中了;和FSK驅(qū)動(dòng)一樣,為了防止干擾對(duì)DTMF來電顯示信息的影響,也在iotcl命令提供了打開、關(guān)閉DTMF來電顯示中斷的命令。

          3 應(yīng)用軟件的設(shè)計(jì)與實(shí)現(xiàn)

          接入點(diǎn)應(yīng)用程序位于前面介紹的硬件平臺(tái)以及設(shè)備驅(qū)動(dòng)程序之上,三者之間的關(guān)系如圖5所示。接入點(diǎn)應(yīng)用程序是整個(gè)軟件的核心,它與串口驅(qū)動(dòng)程序、FSK來電顯示驅(qū)動(dòng)程序、DTMF來電顯示驅(qū)動(dòng)程序、DTMF撥號(hào)驅(qū)動(dòng)程序、Flash驅(qū)動(dòng)程序、振鈴驅(qū)動(dòng)程序交互,并通過后五個(gè)驅(qū)動(dòng)程序控制具體硬件完成相關(guān)功能。接入點(diǎn)可以對(duì)允許接入的藍(lán)牙終端屬性進(jìn)行設(shè)備,只有被授權(quán)的藍(lán)牙終端才能通過接入點(diǎn)訪問PSTN。接入點(diǎn)的Flash可設(shè)置多個(gè)允許接入的藍(lán)牙終端,并可通過與網(wǎng)關(guān)并聯(lián)的電話進(jìn)行增添、刪除一個(gè)或全部刪除終端設(shè)置的操作。

          對(duì)于設(shè)置為雙模的藍(lán)牙手機(jī),必須先向網(wǎng)絡(luò)登記,網(wǎng)絡(luò)返回成功信息的方可與網(wǎng)關(guān)建立物理和邏輯鏈路;而在雙模手機(jī)主動(dòng)與網(wǎng)關(guān)拆開物理鏈路時(shí),也必須向網(wǎng)絡(luò)登記。接入點(diǎn)可以發(fā)現(xiàn)已登記的雙模手機(jī)是否離開本網(wǎng)關(guān)信號(hào)覆蓋范圍,并自動(dòng)向網(wǎng)絡(luò)登記,將雙模手機(jī)的話務(wù)切換回移動(dòng)網(wǎng)絡(luò)中,而并模終端無需這樣的操作。網(wǎng)關(guān)可同時(shí)與7個(gè)藍(lán)牙終端建立ACL(Asynchronous Connection Less)對(duì)于不同調(diào)制方式(FSK及DTMF)來電均能接收號(hào)碼以及振鈴,并根據(jù)來電號(hào)碼分析被呼叫方,根據(jù)藍(lán)牙無繩電話協(xié)議CTP(Cordless Telephony Profile)建立起TCS(Telephone Control Specification)鏈路、SCO(Synchronous Connection Oriented)鏈路。當(dāng)來電顯示為非特服號(hào)開頭的號(hào)碼時(shí),表示來電來普通電話,所有與網(wǎng)關(guān)相連的分機(jī)終端都振鈴。某一終端接聽后,其它終端停止振鈴,回到空閑狀態(tài)。當(dāng)來電顯示為特服號(hào)開頭的時(shí)候,表示來電為訪問特定終端的話務(wù),可以分析來電顯示的格式得到接入順序號(hào),并使對(duì)應(yīng)的藍(lán)牙終端振鈴。藍(lán)牙雙?;蛘邌文=K端能通過網(wǎng)關(guān)、PSTN網(wǎng)絡(luò)撥打外部電話,網(wǎng)關(guān)支持終端多次撥號(hào),并且外部電話能收到來電顯示。

          我們?cè)O(shè)計(jì)的應(yīng)用程序流程如圖6所示。在μClinux系統(tǒng)中,此應(yīng)用程序被視為一個(gè)用戶進(jìn)程。在系統(tǒng)啟動(dòng)rc腳本文件的末尾添加該進(jìn)程,則系統(tǒng)在完成初始化工作后會(huì)自動(dòng)啟動(dòng)該進(jìn)程。對(duì)用戶進(jìn)程而言,硬件設(shè)備被視為設(shè)備描述文件,它和普通的文件沒有區(qū)別,可用文件描述符(一個(gè)非負(fù)整數(shù))表示。在程序啟動(dòng)時(shí),用Linux系統(tǒng)提供的open函數(shù)打開這些設(shè)備,同時(shí)設(shè)置這些設(shè)備的工作方式;啟動(dòng)藍(lán)牙協(xié)議棧,并設(shè)置工作模式、服務(wù)發(fā)現(xiàn)數(shù)據(jù)庫和其它參數(shù),使網(wǎng)關(guān)始終處于被發(fā)現(xiàn)和被動(dòng)建鏈的一方。


          此后應(yīng)用程序地偵聽、等待各設(shè)備數(shù)據(jù)的到來,我們采用了I/O多咱轉(zhuǎn)接的技術(shù)來實(shí)現(xiàn)對(duì)多個(gè)描述符的讀、寫和管理。該技術(shù)的基本思想是:先構(gòu)造一張有關(guān)描述符的表,然后調(diào)用一個(gè)函數(shù),它要到描述符中的一個(gè)已準(zhǔn)備好表示I/O時(shí)才返回。在返回時(shí),它告訴進(jìn)程哪一個(gè)描述符已準(zhǔn)備好可以進(jìn)行I/O。select函數(shù)可以執(zhí)行I/O多路轉(zhuǎn)換,傳向該函數(shù)的參數(shù)告訴內(nèi)核我們所關(guān)心的描述符、對(duì)于每個(gè)描述符我們所關(guān)心的條件(是否讀一個(gè)給定的描述符?是否想寫一個(gè)給定的描述符?是否關(guān)心一個(gè)描述符的異常條件?)以及希望等待的時(shí)間(可以永遠(yuǎn)等待、等待固定時(shí)間或完全不等待)。我們?cè)诔绦蛑性O(shè)置了永遠(yuǎn)等待,即只有所指定的描述符中的一個(gè)已準(zhǔn)備好或捕捉到一個(gè)信號(hào)才返回。從select返回時(shí),內(nèi)核告訴我們已準(zhǔn)備好的描述符的數(shù)量和哪一個(gè)描述符已準(zhǔn)備好讀、寫或異常條件,應(yīng)用程序這個(gè)信息進(jìn)入相應(yīng)的處理子模塊。

          結(jié)語

          基于嵌入式μClinux系統(tǒng)的藍(lán)牙PSTN網(wǎng)關(guān)實(shí)現(xiàn)了上術(shù)的所有功能,使藍(lán)牙三合一電話的應(yīng)用成為現(xiàn)實(shí)。最多7個(gè)藍(lán)牙終端能同時(shí)與該網(wǎng)關(guān)建立物理和邏輯鏈路,網(wǎng)關(guān)能建立起一條語音鏈路。經(jīng)實(shí)測(cè),在傳輸距離不超過10m的前提下,話音質(zhì)量良好,清晰無失真;在傳輸距離超過10m后,由于藍(lán)牙的自動(dòng)功率控制功能,會(huì)增大發(fā)射功率,模擬語音電路部分引入的電磁干擾噪聲增加,影響通話效果,此問題可以通過調(diào)整PCB布局布線和對(duì)易干擾電路增加屏蔽來消除。根據(jù)標(biāo)準(zhǔn)藍(lán)牙協(xié)議,藍(lán)牙終端和網(wǎng)關(guān)之間最多可建立起3條語音鏈路,這將在下一個(gè)版本中加以改進(jìn)。



          評(píng)論


          相關(guān)推薦

          技術(shù)專區(qū)

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();