PixArt PAR2832 核心採用32 bits ARM Cortex-M0 並整合藍牙低功耗5.2的SoC,且內嵌512KB Flash 及 40KB SRAM,具備硬體滑鼠按鍵除彈跳、硬體滾輪編碼、硬體LED閃爍PWM、10 bits ADC、SPI、I2C及UART等,能減省韌體開發所需時間。在原相所提供之原代碼上進行韌體開發時之心得記錄如下。
1. 韌體開發環境及原代碼:開發環境使用Keil uVision ,主程式如下圖所示。

mouse_init 中對滑鼠按鍵、滾輪、LED及Sensor 做初始化,或需要新增或修改自定義功能所需的I/O,可在此作修改。

2. Power state:
因做為無線滑鼠需要考量功耗,故在韌體中對此需要做一些機制,以達到省電的目的。原相的原代碼中將狀態分成三種,分別為ACTIVE、SLEEP 及 POWER DOWN。
透過下圖說明三種狀態的切換條件及目的:
idle 1: 在ACTIVE下當預設滑鼠超過100ms無任何操作後切換到SLEEP。
idle 2:在SLEEP下當滑鼠預設超過三分鐘無任何操作後切換到POWER DOWN。
power down:在ACTIVE下當藍牙廣播結束、藍牙斷線下或偵測到低電量時切換到POWER DOWN。
active 1:在SLEEP下偵測到滑鼠操作包含按鍵、移動或滾輪…等操作後切換至ACTIVE。
active 2:在POWER DOWN下偵測到滑鼠操作包含按鍵、移動或滾輪等操作後切換至ACTIVE。
2-1. ACTIVE:
透過下圖說明ACTIVE 下韌體主迴圈及TIMER的流程及其功能。
framework_dev_process_fn:藍芽模式下處理藍牙相關event ,其中ble_evt_type & _SYS_EVT_TYPE如下方二圖所列。
device_rf_usb_swtich_event_handler:預留2.4G/BLE 雙模使用。
pxi_ble_sched_execute: Flash operation task。
ota_scheduled_task:藍牙OTA處理。
_check_mouse_data:偵測滑鼠按鍵及取得Sensor 資料。
_check_pairing_button:透過I/O 偵測,若該按鍵預設被按下超過三秒則進入藍牙配對模式。
_ble_cpi_check:預設按壓滑鼠左鍵加右鍵超過五秒,可切換CPI。目前原代碼中可支援原相PAW3220 (CPI 預設可切換1200/1600/2400/3200)、PAW3335 (CPI 預設可切換400/800/1600/2400/3200/6400)或PAW3370 (CPI 預設可切換400/800/1600/3200/6400) 此三種sensor,可依照產品需求做選擇。
Battery detection:偵測電壓百分比及過低電壓判斷。
2-2. Sleep:
當切換到SLEEP 下藍牙latency 開啟,而TIMER 會每間隔一秒wakeup 起來預設計數超過三分鐘後,切換到POWER DOWN。

2-3. Power down:
當切換到POWER DOWN 時,藍芽關閉,且TIMER 停止。

3. 藍牙相關設定:
在ble_init中可以設定GATT profile、Security parameters、Connction parameters…等。細部可參考下圖:

廣播設定可於ble_adv_start 做修改。
若需要新增或修改滑鼠的report descriptor 可以在韌體中修改,並透過原相APP修改report value,修改完成後透過APP轉出C code 到Keil 環境中。
預設滑鼠的上報格式如下表:
Byte 0 |
Byte 1 |
Byte 2 |
Byte 3 |
Byte 4 |
Byte 5 |
Byte 6 |
Byte 7 |
Report ID 2 |
Button |
X |
Y |
Wheel |
AC Pan |
4. 總結:
整體而言,原相已提供相當完整的原代碼及APP,能提供韌體開發人員針對所需要功能做細部修改即可,大幅度減少韌體開發時從無到有的過程。後續如有機會再針對其他部分做細部說明。
評論