Keyboard firmwares for Atmel AVR and Cortex-M
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

MEMO.txt 17KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491
  1. Roving RN-42
  2. ============
  3. TODO
  4. ----
  5. Bug:
  6. - with Nexus5 keyboard and mouse are very laggy.
  7. Power saving:
  8. - 8MHz clock
  9. - When not connected in a few minutes get into deep sleep to save battery life
  10. - CTS is needed for waking up from deep sleep? How deep sleep is activated?
  11. - firmware controlled 3.3V DC converter to switch on/off BT module
  12. - sleep MCU and BT module(keyboard is not used)
  13. - deep sleep MCU and BT module(keyboard is not used for long time)
  14. - deep sleep MCU and turn off BT module(keyboard is not used and not connected)
  15. - Battery ADC; switching, high resistance
  16. - switching gnd end of divider with PF4
  17. - high resistor 100K/1M?
  18. capacitor 10nF
  19. http://www.eevblog.com/forum/beginners/measuring-battery-voltage-without-consuming-current/
  20. Improving:
  21. - BT LED; connecting, linked, sleeping, deep sleeping
  22. - Battry LED; blink(using timer?)
  23. - move rn42 to protocol directory when it becomes reusable stack
  24. - LUFA sendchar should be buffered and serial_uart.c buffur size is too large(256).
  25. - ADC resolution
  26. AVR120
  27. AVR32138
  28. Testing:
  29. - Factroy reset doesn't work; need to **test again** 10K pull-up is too high?
  30. - Lipo voltage ADC value is not stabilized
  31. - DCDC converter: squeaky inducter; try other inductors
  32. - Keymap layer bug: during space is pressed(mousekey) press Fn(HHKB) then release space before Fn, in result HHKB layer is locked(toggled) unintentionally.
  33. Done:
  34. - low battery alert(solid light) 09/04
  35. Power routing
  36. -------------
  37. Current:
  38. (USB) +---(Lipo)
  39. | | |
  40. | | +------+ DPDT
  41. | | |Switch/-----------------------+
  42. | | +------+ |
  43. | +-------+ | |
  44. +-|Charger| | |
  45. | +-------+ | +---+ |
  46. | | |MCU| |
  47. | | +---+ |
  48. | | | |
  49. | | | |
  50. +--------------+ +-----+ +------+ +---/--+ +-----+
  51. |Power Selector|--|DC 5V|--|DC3.3V|---|Switch|----|RN-42|
  52. +--------------+ +-----+ +------+ +------+ +-----+
  53. USB Power is boosted unnecessarily, not harmful?
  54. Idea 1:
  55. (USB) +---(Lipo)
  56. | | |
  57. | | +------+ DPDT
  58. | | |Switch/----------+
  59. | | +------+ |
  60. | +-------+ | |
  61. +-|Charger| | |
  62. | +-------+ | +---+ |
  63. | +-----+ |MCU| |
  64. | |DC 5V| +---+ |
  65. | +-----+ | |
  66. | | | |
  67. +--------------+ | +---/--+ +------+ +-----+
  68. |Power Selector|-----+---|Switch|----|DC3.3V|-----|RN-42|
  69. +--------------+ +------+ +------+ +-----+
  70. To enable BT when USB powered it still needs to turn siwtch on, Lipo consumes quinscent current at 5V converter in vain.(Not good)
  71. Idea 2:
  72. (USB) +---(Lipo)
  73. | | |
  74. | | +------+
  75. | | |Switch|
  76. | | +------+
  77. | +-------+ |
  78. +-|Charger| |
  79. | +-------+ | +---+
  80. | +-----+ |MCU|----+ Controlled by firmware
  81. | |DC 5V| +---+ | On: Lipo powered
  82. | +-----+ | | Off: USB powered
  83. | | | |enable
  84. +--------------+ | +------+ +-----+
  85. |Power Selector|-----+---|DC3.3V|-----|RN-42|
  86. +--------------+ +------+ +-----+
  87. MCU can controlled power of RN-42 without hardware switch.
  88. When USB powered and switch is on Lipo consumes quinscent current at 5V converter in vain.(Not good)
  89. Idea 3:
  90. (USB) +---(Lipo)
  91. | | |
  92. | | +------+
  93. | | |Switch|SPST(or without)
  94. | | +------+
  95. | +-------+ |
  96. +-|Charger| |
  97. | +-------+ | +---+
  98. | | |MCU|----+ Controlled by firmware
  99. | | +---+ | On: Lipo powered
  100. | | | | Off: USB powered
  101. | | | |enable
  102. +--------------+ +-----+ +------+ +-----+
  103. |Power Selector|-|DC 5V|-|DC3.3V|-----|RN-42|
  104. +--------------+ +-----+ +------+ +-----+
  105. Switch is needed to save Lipo when not used because decent power saving is not available now. If firmware can turn off BT module completely and make MCU deep sleep the switch will be not even needed.
  106. DONE:
  107. - BT_INDICATOR LED turns on wrongly when touching line or pin. -- pull-up enabled on PF6/GPIO2 08/30
  108. - Lipo charger configuration: fast charge time: USB charger spec? -- used 2kohm
  109. - use LED of charger to alarm low battery. LED should be powered directly from Lipo? - cancel; powered from VUSB
  110. - Use RTS in serial_uart.c to resolve missing chars from help message of RN-42 - done
  111. - CTS/RTS lines are needed? just connect in loop back if no flow control is needed. - done
  112. - add IO pin to charger status CHRG; LED control(low) and detect charge status(input HiZ) 07.24
  113. - LINKED: add trace on PIO2 to PF6 07.24
  114. - Lipo voltage ADC sensing
  115. - Lipo charger MCP73831: needs capacitor 4.7uF *2
  116. - USB connection check - 07.01
  117. - BT on/off check: whether RX line is pulled up? - checking RTS 07.01
  118. - USB/BT switching BT is on -> BT, BT is off -> USB - 07.01
  119. - Under voltage lock out UVLO for protection of Lipo - Lipo has discharge protection at 3.100V 07.01
  120. - Power saving: HHKB scan, BT radio control - 9h with 850mAh, this is enough 07.01
  121. - Power selector doesn't work; Q4 MOSFET leaks from Lipo to USB power line. -- use Schottky instead 07/04
  122. TROUBLE SHOOT
  123. -------------
  124. 07/16 After fix of voltage dividor on GPIO6, had a trouble that it could not send a char to BT module, though could receive.
  125. Found R8 had wrong 1K resistor and changed to 10K, after that it can send to the module again. Not sure how it had sent with the wrong 1K before.
  126. 07/18 On Linux, had an USB related trouble; keyobard or console didn't work for some reason. Changing PID cured this problem. Very annoying, took very long time before resolved it.
  127. Lipo
  128. ----
  129. 850mA lasts around 9 hours(07/28)
  130. Sparkfun Polymer Lithium Ion Battery 850mAh:
  131. https://www.sparkfun.com/products/341
  132. Lipo Cell spec:
  133. https://www.sparkfun.com/datasheets/Batteries/063048%20Li-polymer.pdf
  134. Protection spec:
  135. http://dlnmh9ip6v2uc.cloudfront.net/datasheets/Prototyping/BatteryProtection.pdf
  136. min typical max
  137. over-charge 4.255 4.280 4.305
  138. over-charge discover? 4.030 4.080 4.130
  139. over-discharge 2.827 2.900 2.973
  140. over-discharge discover 3.022 3.100 3.178
  141. ADC voltage monitor: voltage divider 10K+10K(0.5)
  142. ADC=V*0.5/2.56*1024
  143. V ADC
  144. ------------------
  145. 4.20 0x347(839)
  146. 3.10 0x26b(619)
  147. Configuration
  148. -------------
  149. Ver 6.15 04/26/2013
  150. (c) Roving Networks
  151. ***Settings***
  152. BTA=0006664B3AE3
  153. BTName=tmkBT-3AE3
  154. Baudrt(SW4)=115K
  155. Mode =DTR
  156. Authen=2
  157. Bonded=0
  158. Rem=000000000000
  159. ***ADVANCED Settings***
  160. SrvName= keyboard/mouse
  161. SrvClass=0000
  162. DevClass=0000
  163. InqWindw=0100
  164. PagWindw=0100
  165. CfgTimer=255
  166. StatuStr=NULL
  167. HidFlags=3c
  168. DTRtimer=8
  169. KeySwapr=0
  170. ***OTHER Settings***
  171. Profile= HID
  172. CfgChar= $
  173. SniffEna=8010
  174. LowPower=0
  175. TX Power=0
  176. IOPorts= 0
  177. IOValues=0
  178. Sleeptmr=0
  179. DebugMod=0
  180. RoleSwch=0
  181. Serial connection
  182. -----------------
  183. Serial line: 115200bps, 8bit, 1-stopbit, non-parity, no flow control
  184. SSP: 115200bps, 8bit, 1-stopbit, non-parity, no flow control(via Bluetooth)
  185. To enter command mode disconnect the module from host and type '$$$'.(you will see 'CMD')
  186. To exit type '---'(you will see 'END') and '+' to get local echo.
  187. Setting command mode
  188. --------------------
  189. S-,tmkBT // Device name
  190. SS,keyboard/mouse // service name
  191. SM,4 // Auto Connect DTR mode
  192. SW,8010 // Sniff enable 0x10*0.625ms=10ms; 50ms is laggish and not much power save
  193. S~,6 // HID profile
  194. SH,003C // HID register
  195. SY,0004 // Transmit power
  196. Other options:
  197. SC,0000 // COD: 000005C0 (see HID spec/Bluegiga doc)
  198. SD,05C0 // bit 12-8 7 6 5-0
  199. // 00101 1 1 0
  200. // peripheral pointing keybaord joystick, gamepad, ...
  201. SM,6 // Pairing mode: auto connect
  202. SM,4 // Master mode: Connection can be controled with GPIO6
  203. HID profile
  204. -----------
  205. S~,6 HID profile
  206. S~,0 SPP profile
  207. R,1 reboot
  208. Apple iOS
  209. ---------
  210. Keyboard can be used with iPhone, but mouse cannot.
  211. To operate iOS with keyboard is not so useful, though.
  212. There may be iOS specific scancodes?
  213. HID flag register
  214. -----------------
  215. SH,0200
  216. GH
  217. 10 0000 0000(0200) default
  218. 00 0011 1000(0038) Combo
  219. || | | |\_\____ number of paired devices to which the module can reconnect
  220. || | | \_______ send out reports over UART (0xFF <len> <data>)
  221. || \__\_________ descriptor type
  222. |\______________ toggle virtual keyboard on iOS when first connected
  223. \_______________ Force HID mode if GPIO11 is high on power-up
  224. Descriptor type:
  225. 0000: keybaord
  226. 0001: Game Pad
  227. 0010: Mouse
  228. 0011: Combo
  229. 0100: Joystick
  230. 1xxx: reserved
  231. Out report - Indicator
  232. ----------------------
  233. 0xFE 0x02 0x01 <LED_state>
  234. LED Status
  235. ----------
  236. Configuring 10 times per sec
  237. Startup/configuration timer 2 times per sec
  238. Discoverable/Inquiring/Idle once per sec
  239. Connected solid on
  240. Pairing
  241. -------
  242. First, host initiates pairing process and once it is done, auto connect will work thereafter.
  243. SM,3 Master mode
  244. SM,4 Auto Connect DTR Mode uses GPIO6 to make and break connection(Mode =DTR)
  245. confirm: auto connect works and control connection with GPIO6
  246. SM,5 Auto Connect ANY Mode (Mode =ANY)
  247. each time GPIO is set, make inquiry and connect to the first found device
  248. SM,6 automatically reconnect(Mode =Pair)
  249. confirm: auto connect works well but difficult to enter command mode.
  250. Fast data mode
  251. --------------
  252. The module enters fast data mode after 'remote configuration timer' window is passed from power on.
  253. In this mode the module does not accept '$$$' to enter command mode.
  254. Power Management
  255. ----------------
  256. Inquiry and Page window Idle or Active (3.1.1)
  257. Downside: delay in discovery or connection time
  258. SI, // set inquiry scan window(discovery) on/off duty?
  259. SJ, // set page scan window(connection)
  260. This reduces averaege power >20mA to 5mA(3mA in Sniff mode)
  261. Sniff mode Transmit
  262. Sniff mode is disabled by default and radio is active continuously when connected.(25-30mA)
  263. In Sniff mode the radio wakes up intermittently and sleeps in very low power mode.(2mA)
  264. SW,<val> // set interval timer(*0.625ms) 0000-7FFF
  265. Deep sleep Idle (3.1.2)
  266. In this mode the module shuts down completly and only draws about 300uA. To enable this set the most signifant bit(0x8000) of Sniff interaval timer.
  267. SW,8320 // deep sleep enable(interval=0x320*0.625=500ms)
  268. In normal sleep the firmware is still running in idle mode, and wakes up about 20 times per second to check ports, update LEDs, etc. During deep sleep, the firmware actually stops runnig some tasks and the LEDs only update about once per second.
  269. To wake from deep sleep there are three ways: (in worst case wake up takes 5ms)
  270. *send a charactor to the UART(first charactor will be lost)
  271. *toggle CTS low to high and wait 5ms
  272. *wake automatically every slot time(<val>*0.625ms)
  273. Once the radio is awake it stay active for exactly 1 second of inactivity and then sleeps again.
  274. Downside: latency and data loss
  275. Disable Output driver Idle or Active (3.1.3)
  276. S%,1000 // set all GPIO pins(0-11) to inputs.
  277. Lower Transmit Power Idle or Active (3.1.4)
  278. SY,<hex> // transmit power setting(takes effect after a power cycle and reboot)
  279. Downside: reducing effective range
  280. Optimizig for Latency
  281. ---------------------
  282. By default the firmware is optimized for throughput.
  283. SQ,16 // set latency bit
  284. SQ,0 // unset latency bit
  285. Configuration timer settings
  286. ----------------------------
  287. Remote configuration is used for the module to be configured with various commands over Bluetooth(SPP profile only?).
  288. The module has remote configuration timer to allow remote configuration over Bluetooth after power up in Slave mode. In Master modes the remote configuration timer is set to 0(no remote configuration). (In Trigger Master mode the timer is used as an idle timer to break the connection after time expires with no charactors receive.)
  289. ST,0 // no remote, no local when connected
  290. ST,<1-252> // local and remote with timeout in seconds from power up
  291. ST,253 // local only without timeout
  292. ST,254 // remote only without timeout
  293. ST,255 // local and remote without timeout
  294. Android
  295. -------
  296. 3.7.1.5 Note: To connect with Android phone the modules must wake up 11ms every 2.5seconds.
  297. Commands
  298. --------
  299. SC,
  300. SM,<val>
  301. SD,
  302. SP,<string> Pin code(alpahnumeric)
  303. SQ,<mask> Special configuration(GPIO, discovery mode, low latency, reboot, UART)
  304. SR,<hex> Store remote address
  305. SR,Z Erase all address
  306. SS,<string> Set service name(1-20)**
  307. ST,<val> Remote configuration timer(Master:0, Slave:0-255, Triger:as idle timer)
  308. SU,<val> UART baud rate
  309. SW,<val> low-power sniff mode** deep sleep and wake up every 625us * <val>
  310. SX,<0|1> bonding enable only acceps device that matches the stored address
  311. SY,<hex> power setting**
  312. SZ,<val> non-standard raw baud rate <val>=baud*0.004096
  313. S~,<val> Profile 0:SPP, 5:APL, 6:HID
  314. S-,<string> Device name -15 alphanumeric charactors
  315. S?,<0|1> role switch enable
  316. S$,<char> command mode char
  317. $|,<hex> low-power connect mode deep sleep/active(discoverable and connectable) cycle
  318. D display basic setting
  319. E display extended setting
  320. GB display the device's Bluetooth address
  321. GF display Bluetooth address of connected device
  322. GK show connection status
  323. GR show remote address for reconnecting
  324. G& show GPIO pin
  325. G<char> show stored setting
  326. + toggle local echo on/off
  327. & show GPIO 3,4,6,7(DIP switch)
  328. C connect to stored remote address
  329. C,<address> connect last address
  330. CFI connect and go into fast data mode
  331. CFR connect and go into fast data mode
  332. CT,<address>,<val> connect to the address and disconnect after val?
  333. F,1 fast data mod:
  334. H display help
  335. I,<time>,<cod> inquiry scan with <cod>
  336. IN
  337. IQ scan
  338. IS inquiry scan with 001F00
  339. J hide pin code
  340. K, kill disconnects current connection
  341. L link quality
  342. M show modem signlal status
  343. O display other settings
  344. P,<car> pass through?
  345. Q quiet mode make the module not discoverable
  346. Q,0 discoverable and connectable
  347. Q,1 not discoverable and not connectable
  348. Q,2 not discoverable and connectable
  349. Q,? display current quiet mode
  350. R,1 reboot
  351. T,<0|1> pass received data while in command mode
  352. U,<baud>,<parity> change UART setting tentatively
  353. V display firmware version
  354. W wake from quiet mode enable discovery and connection
  355. Z deep sleep mode(<2mA)
  356. help
  357. ----
  358. *** SET COMMANDS ***
  359. SA,<3,0> - Authentication
  360. SC,<hex> - Service Class
  361. SD,<hex> - Device Class
  362. SE,<1-16> - UUID
  363. SF,1 - Factory Defaults
  364. SH,<hex> - HID flags
  365. SI,<hex> - Inquiry Scan Window
  366. SJ,<hex> - Page Scan Window
  367. SL,<E,O,N> - Parity
  368. SM,<0-5> - Mode (0=slav,1=mstr,2=trig,3=auto,4=DTR,5=Any)
  369. SN,<name> - Name
  370. SO,<text> - conn/discon Status
  371. SP,<text> - Pin Code
  372. SR,<adr> - Remote Address
  373. SS,<text> - Service Name
  374. ST,<num> - Config Timer
  375. SU,<rate> - Baudrate
  376. SW,<hex> - Sniff Rate
  377. SX,<1,0> - Bonding
  378. SY,<hex> - TX power
  379. SZ,<num> - Raw Baudrate
  380. S~,<0-6> - Profile (0=SPP,1=DCE,2=DTE,3=MDM,4=D&S,6=HID
  381. S?,<0-1> - role switch
  382. S$,<char> - CMD mode char
  383. S@,<hex> - io port dir
  384. S&,<hex> - io port val
  385. S%,<hex> - io boot dir
  386. S^,<hex> - io boot val
  387. S*,<hex> - pio(8-11) set
  388. S|,<hex> - low power timers
  389. S+,<num> - DTR timer
  390. S=,<hex> - Key mapper
  391. S:,<num> - sleep timer
  392. *** DISPLAY ***
  393. D - Basic Settings
  394. E - Extended Settings
  395. G<X> - Stored setting
  396. GB - BT Address
  397. GF - BT Address of Last Connection
  398. GK - Connect Status
  399. G& - I/O Ports
  400. V - Firmare version
  401. *** OTHER ***
  402. C,<adr> - Connect
  403. F,1 - Fast Mode
  404. I,<time>,<cod> - Device Scan Inquiry
  405. J - Hide Pin Code
  406. K, - Kill (disconnect)
  407. L, - toggle local echo
  408. P,<text> - Pass Thru
  409. Q - Quiet (no discovery)
  410. R,1 - Reboot
  411. T,<0,1> - send data in CMD mode
  412. U,<rate>,<E,O,N> - Temp Uart Change
  413. Z - low power sleep
  414. & - Read switches