documentation cleanup

example_keyboards
jpetermans 8 years ago
parent b5675e2025
commit 821f72eae9

@ -3,10 +3,10 @@ Backlight for Infinity60
## Led Controller Specs ## Led Controller Specs
The Infinity60 pcb uses the IS31FL3731C matrix LED driver from ISSI [datasheet](http://www.issi.com/WW/pdf/31FL3731C.pdf). The IS31 has the ability to control two led matrices (A & B), each matrix controlling 9 pins, each pin controlling 8 leds. The Infinity only utilizes matrix A. The Infinity60 (revision 1.1a) pcb uses the IS31FL3731C matrix LED driver from ISSI [(datasheet)](http://www.issi.com/WW/pdf/31FL3731C.pdf). The IS31 has the ability to control two led matrices (A & B), each matrix controlling 9 pins, each pin controlling 8 leds. The Infinity only utilizes matrix A.
Infinity60 LED MAP: Infinity60 LED Map:
digits mean "row" and "col", i.e. 45 means C4-5 in the IS31 datasheet, matrix A digits mean "row" and "col", i.e. 45 means pin 4, column 5 in the IS31 datasheet
```c ```c
11 12 13 14 15 16 17 18 21 22 23 24 25 26 27* 11 12 13 14 15 16 17 18 21 22 23 24 25 26 27*
28 31 32 33 34 35 36 37 38 41 42 43 44 45 28 31 32 33 34 35 36 37 38 41 42 43 44 45
@ -17,19 +17,26 @@ digits mean "row" and "col", i.e. 45 means C4-5 in the IS31 datasheet, matrix A
*Unused in Alphabet Layout *Unused in Alphabet Layout
The IS31 includes 8 pages (or frames) 0-7 and each page consists of 0xB4 (144) bytes The IS31 includes 8 pages (or frames) 0-7 and each page consists of 0xB4 (144) bytes
- **0 - 17** LED control (on/off). 18 pins which alternate between A and B matrices (CA1, CB1, CA2, CB2, ..). Each byte controls the 8 leds on that pin with bits (8 to 1). - **0 - 17**
- **18 - 35** Blink control. Same as LED control above, but sets blink on/off. * LED control (on/off).
- **36 - 143** PWM control. One byte per LED, sets PWM from 0 to 255. Same as above, the register alternates bytes between the A & B matrices. * 18 pins which alternate between A and B matrices (CA1, CB1, CA2, CB2, ..).
* Each byte controls the 8 leds on that pin with bits (8 to 1).
- **18 - 35**
* Blink control.
* Same as LED control above, but sets blink on/off.
- **36 - 143**
* PWM control. One byte per LED, sets PWM from 0 to 255.
* Same as above, the register alternates, every 8 *bytes* (not bits) between the A & B matrices.
## Led Controller Code ## Led Controller Code
led_controller.c sets up ability to write led layers at startup or control leds on demand as part of fn_actions. By default led_controller.c assumes page 0 will be used for full on/off and page 7 for controlling individual leds. The remaining 6 pages (1-6) are free to preset led maps at init or on demand. Communication with the IS31 is primarily done through the led_mailbox using chMBPost described further below under "Sending messages in Keymap.c" In the Infinity60 project folder, led_controller.c sets up ability to write led layers at startup or control leds on demand as part of fn_actions. By default led_controller.c assumes page 0 will be used for full on/off and page 7 for controlling individual leds. The remaining 6 pages (1-6) are free to preset led maps at init or on demand. Communication with the IS31 is primarily done through the led_mailbox using chMBPost described further below under "Sending messages in Keymap.c"
One function is available to directly control leds: One function is available to directly set leds without the mailbox:
``` ```
write_led_page(page#, array of leds by address, # of leds in array) write_led_page(page#, array of leds by address, # of leds in array)
``` ```
This function saves a full page using a supplied array of led locations such as: This function saves a full page using a supplied array of led locations such as:
``` ```c
uint8_t led_numpad[16] = { uint8_t led_numpad[16] = {
18,21,22,23, 18,21,22,23,
37,38,41,42, 37,38,41,42,
@ -39,24 +46,24 @@ uint8_t led_numpad[16] = {
write_led_page(5, led_numpad, 16); write_led_page(5, led_numpad, 16);
``` ```
Remaining led control is done through the led mailbox using these message types. Remaining led control is done through the led mailbox using these message types:
- **SET_FULL_ROW** - 3 bytes: row#, message type, 8-bit mask. Sets all leds on one pin per the bit mask. - **SET_FULL_ROW** (3 bytes) - row#, message type, 8-bit mask. Sets all leds on one pin per the bit mask.
- **OFF_LED** - 2 bytes: message type, led address. Turn off specific led. - **OFF_LED** (2 bytes) - message type, led address. Turn off specific led.
- **ON_LED** - 2 bytes: message type, led address. Turn on specific led. - **ON_LED** (2 bytes) - message type, led address. Turn on specific led.
- **TOGGLE_LED** - 2 bytes: message type, led address. Toggle specific led on/off. - **TOGGLE_LED** (2 bytes) - message type, led address. Toggle specific led on/off.
- **BLINK_OFF_LED** - 2 bytes: message type, led address. Set blink off for specific led. - **BLINK_OFF_LED** (2 bytes) - message type, led address. Set blink off for specific led.
- **BLINK_ON_LED** - 2 bytes: message type, led address. Set blink on for specific led. - **BLINK_ON_LED** (2 bytes) - message type, led address. Set blink on for specific led.
- **BLINK_TOGGLE_LED** - 2 bytes: message type, led address. Toggle blink for specific led. - **BLINK_TOGGLE_LED** (2 bytes) - message type, led address. Toggle blink for specific led.
- **TOGGLE_ALL** - 2 bytes: message type, not used. Turn on/off full backlight. - **TOGGLE_ALL** (2 bytes) - message type, not used. Turn on/off full backlight.
- **TOGGLE_BACKLIGHT** - 2 bytes: message type, on/off. Sets backlight completely off, no leds will display. - **TOGGLE_BACKLIGHT** (2 bytes) - message type, on/off. Sets backlight completely off, no leds will display.
- **DISPLAY_PAGE** - 2 bytes: message type, page to display. Switch to specific pre-set page. - **DISPLAY_PAGE** (2 bytes) - message type, page to display. Switch to specific pre-set page.
- **RESET_PAGE** - 2 bytes: message type, page to reset. Reset/erase specific page. - **RESET_PAGE** (2 bytes) - message type, page to reset. Reset/erase specific page.
- **TOGGLE_NUM_LOCK** - 2 bytes: message type, on/off (NUM_LOCK_LED_ADDRESS). Toggle numlock on/off. Usually run with the `set_leds` function to check state of numlock or capslock. If all leds are on (e.i. TOGGLE_ALL) then this sets numlock to blink instead (this is still a little buggy if toggling on/off quickly). - **TOGGLE_NUM_LOCK** (2 bytes) - message type, on/off (NUM_LOCK_LED_ADDRESS). Toggle numlock on/off. Usually run with the `set_leds` function to check state of numlock or capslock. If all leds are on (e.i. TOGGLE_ALL) then this sets numlock to blink instead (this is still a little buggy if toggling on/off quickly).
- **TOGGLE_CAPS_LOCK** - 2 bytes: message type, on/off (CAPS_LOCK_LED_ADDRESS). Same as numlock. - **TOGGLE_CAPS_LOCK** (2 bytes) - message type, on/off (CAPS_LOCK_LED_ADDRESS). Same as numlock.
- **STEP_BRIGHTNESS** - 2 bytes: message type, and step up (1) or step down (0). Increase or decrease led brightness. - **STEP_BRIGHTNESS** (2 bytes) - message type, and step up (1) or step down (0). Increase or decrease led brightness.
## Sending messages in Keymap.c ## Sending messages in Keymap.c
Sending an action to the led mailbox is done using chMBPost with the following form. Sending an action to the led mailbox is done using chMBPost:
``` ```
chMBPost(&led_mailbox, message, timeout); chMBPost(&led_mailbox, message, timeout);
``` ```
@ -66,14 +73,14 @@ chMBPost(&led_mailbox, message, timeout);
An example: An example:
1. set the message to be sent. First byte (LSB) is the led address, and second is the message type 1. set the message to be sent. First byte (LSB) is the led address, and second is the message type
`msg=(ON_LED << 8) | 42;` *`msg=(ON_LED << 8) | 42;`
2. send msg to the led mailbox 2. send msg to the led mailbox
`chMBPost(&led_mailbox, msg, TIME_IMMEDIATE);` *`chMBPost(&led_mailbox, msg, TIME_IMMEDIATE);`
Another: Another:
`msg=(BLINK_TOGGLE_LED << 8) | 46;` *`msg=(BLINK_TOGGLE_LED << 8) | 46;`
`chMBPost(&led_mailbox, msg, TIME_IMMEDIATE);` *`chMBPost(&led_mailbox, msg, TIME_IMMEDIATE);`
Finally, SET_FULL_ROW requires an extra byte with row information in the message so sending this message looks like: Finally, SET_FULL_ROW requires an extra byte with row information in the message so sending this message looks like:
`msg=(row<<16) | (SET_FULL_ROW << 8) | (led_pin_byte);` *`msg=(row<<16) | (SET_FULL_ROW << 8) | (led_pin_byte);`
`chMBPost(&led_mailbox, msg, TIME_IMMEDIATE);` *`chMBPost(&led_mailbox, msg, TIME_IMMEDIATE);`

@ -186,7 +186,7 @@ page_status = 0; //start frame 0 (all off/on)
while(true) { while(true) {
// wait for a message (asynchronous) // wait for a message (asynchronous)
// (messages are queued (up to LED_MAILBOX_NUM_MSGS) if they can't // (messages are queued (up to LED_MAILBOX_NUM_MSGS) if they can't
// be processed right away) // be processed right away
chMBFetch(&led_mailbox, &msg, TIME_INFINITE); chMBFetch(&led_mailbox, &msg, TIME_INFINITE);
msg_col = (msg >> 24) & 0xFF;//if needed msg_col = (msg >> 24) & 0xFF;//if needed
msg_pin = (msg >> 16) & 0XFF;//if needed (e.g. SET_FULL_ROW) msg_pin = (msg >> 16) & 0XFF;//if needed (e.g. SET_FULL_ROW)
@ -229,7 +229,7 @@ page_status = 0; //start frame 0 (all off/on)
break; break;
case TOGGLE_ALL: case TOGGLE_ALL:
//msg_led = unused //msg_led = unused
is31_read_register(0, 0x00, &temp); is31_read_register(0, 0x00, &temp);
led_control_reg[0] = 0; led_control_reg[0] = 0;
@ -315,7 +315,7 @@ page_status = 0; //start frame 0 (all off/on)
break; break;
} }
//populate 8 byte rows to write on each pin //populate 8 byte arrays to write on each pin
//first byte is register address, every 0x10 9 bytes are A-register pwm pins //first byte is register address, every 0x10 9 bytes are A-register pwm pins
__builtin_memset(pwm_register_array+1, pwm_levels[pwm_step_status], 8); __builtin_memset(pwm_register_array+1, pwm_levels[pwm_step_status], 8);

Loading…
Cancel
Save