您的位置:首页 > 其它

CSR蓝牙开发手记

2006-11-05 09:34 288 查看
PSDN 和 Audio_gateway

一.Audio Dongle 手机版 1
1. PINCODE 1
2. Acl连接 2
3. Sco连接(接听和挂断电话) 2
4.Ps操作 2
5.按键控制 3
6. 指示灯 3
附录: 3
二.PSDN 电话版 4
7. 铃声控制 4
7.1 增加变量 4
7.2 相关管脚 4
7.3 函数控制 5
8. Pair控制(按键控制) 5
9. 指示灯 5
附录2: 6

一.Audio Dongle 手机版
1. PINCODE
此款支持两种本公司的两种pincode码,分别是”0000”和”1234”。因此,我们做了两个改动:

Inquiry

问题: 在csr版本里,它指在配对前发出1次inquiry,在配对时由于pincode码不对将失败,退出inquiry状态。
解决: 在此,每次配对失败重新再inquiry。此外,我们用一个静态变量 ”TryCnt”来控制重新inquiry的次数,定义的inquiry十次。
涉及文件:pioag_receive.c中的handleIvnquiryCompleteCfm函数。pioag_send.c中的pioAgInquiryReq函数

PinCode

问题: 每次inquiry对方设备进行配对时需要pincode码,要支持我们的两种不同pincode码耳机。
解决: 每次碰到请求pincode时,我们就交替的提供我们的两种pincode发过去。
涉及文件:Pioag_send.c中的pioAgPinReplyReq函数

2. Acl连接

由于我们在CONNECT_AS_SLAVE等待连接时,只是处于pagescanf状态下,等待耳机来连它。而不主动去连耳机,故不需要进inquiryscanf,所以我们把 msg->is_interval = 0x400和msg->is_window = 0x200;均设为零。
涉及文件: ag_connect.c中的agConnectAsSlaveReqAction函数。

3. Sco连接(接听和挂断电话)
(耳机方发出连接要进行通话命令或挂电话或通话结束)

a. 接电话
agScoStatusInd中(ind->status == CmConnectComplete)

1) 初始化audiodongle端的麦克风(通过电话线发给电话另外端)和喇叭音量(通过无线连接发给耳机端)通过PS17和PS18来调节它们的音量。
2)给连接手机或电话的管脚(PIO_CALL)改变状态
psdn :把脚拉高(或低,看继电器规格),让继电器连通dongle,接电话
Audio_dongle : 启动receive_call定时器给脚发出一个高脉冲,告诉手机,耳机接电话,脉冲 长短由ps(persistent store)31来决定
涉及文件:ag_connect.c中agScoStatusInd函数和end_call函数。Hal.c和hal.h整个文件。

b. 挂电话或通话结束
agScoStatusInd中(ind->status == CmConnectDisconnect)

发出请求同时把ACL断开
管脚(PIO_CALL)改变状态
psdn :把脚拉低(或高,看继电器规格),让继电器电话话筒和耳麦
Audio_dongle : 启动receive_call定时器给脚发出一个低脉冲,告诉手机,耳机挂电话,脉冲长短由ps(persistent store)30来决定
涉及文件:ag_connect.c中agScoStatusInd函数和receive_call函数。

4.Ps操作

配对: 为了进入配对模式,我们必须把PS——PIO_AG_PS_IS_PAIRED设为零。为此,我们调用clear_pin_code来复位。
开关机状态标识:PS——PIO_AG_PS_POWERFLAG来标识其状态,读状态和设状态的函数分别是set_power_flag和read_power_flag
涉及文件:上描述所涉及的函数全部在mepin.c中

5.按键控制

a. 按键时间的控制
宏POWER_BUTTON_TIMEOUT 控制按键开关机的时间长短
宏PAIR_BUTTON_TIMEOUT控制开机后还需继续按时间的长短才能进入pair状态。

按键调用
上电后,如果长按键,则调用power_manage函数,进行判断当前状态,
关机状态,启动set_led函数使蓝灯快闪;然后调用power_on函数。在power_on函数中,调用了startReqAction函数去进行连接或配对操作,同时启动pair_button定时器。接着继续判断是否长按,如是长按,则pair_button执行,把以前的配对信息清除,重新进行配对,否则,退出pair_button。
开机状态,启动set_led函数使红灯快闪;然后调用power_off函数进行重启然后僵死等待。

涉及文件:pioag_buttons.c所有函数和宏。

6. 指示灯

在改变AG状态agSetCurrentState的函数中,我们在改变AG状态的同时添加set_led函数来改变其指示灯状态。
涉及文件:ag_state.c中的agSetCurrentState函数,以及led.c和led.h整个文件。

附录:

1)额外使用的PS:
Ps07:开关机状态标志
Ps17: audiodongle端麦克风音量
Ps18: audiodongle端喇叭音量
Ps30: audiodongle给手机端发出标识挂电话脉冲的长度
Ps31: audiodongle给手机端发出标识接电话脉冲的长度

头文件
ag_private.h
struct agStruct{}声明中,增加 uint16 power_state:1(标识当前状态);
增加宏 #define POWERON 1 和 #define POWEROFF 0 标识开关机状态。

pioag_private.h:
struct PioAgStruct{}声明中,增加 TimerHandle ledHandle;(记录当前指示灯)
增加宏#define PIO_AG_PS_POWERFLAG (PIO_AG_PS_BASE+7)(标识开关机状态)

二.PSDN 电话版
在PSDN里,我们是在以前AudioDongle的基础上进行修改的,大部分都继承与audiodongle。
7. 铃声控制
7.1 增加变量
ag_private.h 62à69 添加全局变量声明
ag_main.c中为控制和判断铃声初始化全局变量
/* add for phone test*/
/* 用于判断其信号是否为电话铃声 */
extern uint16 phCnt;
extern clock_t start;
extern clock_t end;
/* 用于控制电话铃声 ,如果在通话中,不进行判断 */
//If not SPEAK nor CONNECT it will be zero.
//ONLY in these states to see whether is the phone incoming.
extern uint16 SPK;

7.2 相关管脚
PIOAG_PRIVATE.H中,
#define REDLED 1<<0
#define BLUELED 1<<1
#define GREENLED 1<<2
#define LED (REDLED|BLUELED|GREENLED)

#define PIO_CONTROL (1<<5) //用于控制是否
#define PIO_CALL (1<<4) //与继电器相连的管脚,用于控制继电器来接挂电话。
#define PIO_PHONE (1<<4) //接收震铃信号的管脚。
#define PIO_SPEAK (1<<) //用于驱动BUZZER发声的管脚。
#define PIO_CTL_BUZZER (1<<)//用于控制是否允许BUZZER工作。

7.3 函数控制
1) ag_connect.c 函数agScoStatusInd
如果是SCO连接完成,说明已经和耳机连接通讯成功,此时,我们就停止铃声,同时标志通讯中(SPK=1),同时忽略震铃管脚的信号(在handleButtonChange里SPK==0才检测震铃管脚)。
如果是SCO断开连接,说明耳机挂断电话,此时,我们通过对SPK的设置,恢复对震铃管脚的信号的侦测。

2) pioag_buttons.c 函数handleButtonChange

a) 我们把它的返回值由默认的ButtonChangeContinue改为ButtonChangeStop,这样它只有在所监控的管脚电频发生变化时才有返回。
b) 当spk为零时,监控震铃管脚。我们在它下降沿取当时时间,然后再在它的上升沿取时间,它们之间的时间间隔为10ms和40ms之间(默认的信号为18ms间隔),我们就视为震铃信号。如果有连续三个这种频率的电频,我们就视为铃声信号,然后调用Beep定时器,给耳机发出响铃命令pioAgRingReq(),如果允许BUZZER的话,给PIO_SPEAK接上高电频,使其发出声音。一秒中后停止铃声。
c) 每次PIO_CTL_BUZZER管脚被触发,我们通过改变PS33里的值来交替改变是否允许BUZZER。

8. Pair控制(按键控制)
相对于audiodongle,我们这里没有开关机的控制键,只有pair控制键PIO_CONTROL,和7。3里边描述的震铃控制键PIO_CTL_BUZZER。
对于PIO_CTL_BUZZER上面已经描述得很详细了,这里我们只讨论进入pair的控制。
pioag_buttons.c中
行17 #define PAIR_BUTTON_TIMEOUT D_mSEC(6000) 用于控制PAIR控制键的按键时间
handleButtonChange函数中进行判断。

9. 指示灯
1) BUZZER指示灯
pioag_init.c函数PioAgInit中,读取PS33的值得到BUZZER的控制状态,如果为1,即允许BUZZER,把绿灯点亮。相关代码:37——>45。在pioag_buttons.c的handleButtonChange中,我们捕捉PIO_CTL_BUZZER按键改变BUZZER的控制状态的同时,改变绿灯的状态。
2) 来电指示
在pioag_buttons.C的Beep()里,我们发出铃声命令的同时设置红灯快闪的状态(语句:set_led(led_off);)
3) 通话时的指示灯
由于通话时系统的状态为AgScoConnected,这样我们只需在led.c的函数set_led中,对AgScoConnected状态进行捕捉控制灯就行了。源码 41——>46

新的版本,绿灯和红灯闪法一样,只是绿灯在BUZZER开的时候才闪,红灯在其关的时候闪。

我们设置一个全局变量PHONELED,在LED.C里驱动REDLED的地方都用这个全局变量给替换;
那些PioSet(GREENLED,0)的地方用PHONELED = REDLED代替,而PioSet(GREENLED, GREENLED)的地方用PHONELED=REDLED替换。
在ag_private.h(70)里增加PHONELED的声明;在ag_main.c里初始化。。。

附录2:
这里增加使用了PS33,用于存储BUZZER的控制状态。

未解决工作:
LED的值应该增加绿灯的值,在配对时的灯表现不对,修改为在配对时,根据蓝灯的状态来点亮蓝灯和PHONELED
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: