Add gamma settings

This commit is contained in:
Kuba Birecki 2021-12-04 21:13:53 +01:00
parent 4ca67aa967
commit 88882ab417
4 changed files with 61 additions and 28 deletions

View file

@ -44,6 +44,7 @@ struct is31fl3741_config {
uint8_t gcc; uint8_t gcc;
uint8_t sws; uint8_t sws;
uint16_t *rgb_map; uint16_t *rgb_map;
uint8_t (*gamma)[256];
}; };
struct is31fl3741_data { struct is31fl3741_data {
@ -112,11 +113,10 @@ static int is31fl3741_strip_update_channels(const struct device *dev, uint8_t *c
int result; int result;
result = is31fl3741_reg_burst_write( result = is31fl3741_reg_burst_write(dev, 0x00, channels,
dev, (num_channels <= IS31FL3741_BUFFER_PAGE_BREAK)
0x00, ? num_channels
channels, : IS31FL3741_BUFFER_PAGE_BREAK);
(num_channels <= IS31FL3741_BUFFER_PAGE_BREAK) ? num_channels : IS31FL3741_BUFFER_PAGE_BREAK);
if (result || num_channels <= IS31FL3741_BUFFER_PAGE_BREAK) { if (result || num_channels <= IS31FL3741_BUFFER_PAGE_BREAK) {
return result; return result;
@ -145,9 +145,9 @@ static int is31fl3741_strip_update_rgb(const struct device *dev, struct led_rgb
} }
while (i < num_pixels) { while (i < num_pixels) {
px_buffer[rgb_map[j++]] = pixels[i].r; px_buffer[rgb_map[j++]] = config->gamma[0][pixels[i].r];
px_buffer[rgb_map[j++]] = pixels[i].g; px_buffer[rgb_map[j++]] = config->gamma[1][pixels[i].g];
px_buffer[rgb_map[j++]] = pixels[i].b; px_buffer[rgb_map[j++]] = config->gamma[2][pixels[i].b];
++i; ++i;
} }
@ -204,8 +204,8 @@ int static is31fl3741_init(const struct device *dev) {
} }
// Configure LED driver operation mode // Configure LED driver operation mode
is31fl3741_reg_write( is31fl3741_reg_write(dev, 0x00,
dev, 0x00, (config->sws << 4) | (0x01 << 3) | 0x01); // SWS, H logic, Normal operation (config->sws << 4) | (0x01 << 3) | 0x01); // SWS, H logic, Normal operation
is31fl3741_reg_write(dev, 0x01, config->gcc); // Set GCC is31fl3741_reg_write(dev, 0x01, config->gcc); // Set GCC
// Set all scaling registers to 0xff, brightness is controlled using PWM // Set all scaling registers to 0xff, brightness is controlled using PWM
@ -245,6 +245,12 @@ static const struct led_strip_driver_api is31fl3741_api = {
\ \
static uint16_t is31fl3741_##idx##_rgb_map[IS31FL3741_BUFFER_SIZE] = DT_INST_PROP(idx, map); \ static uint16_t is31fl3741_##idx##_rgb_map[IS31FL3741_BUFFER_SIZE] = DT_INST_PROP(idx, map); \
\ \
static uint8_t is31fl3741_##idx##_gamma[3][256] = { \
DT_INST_PROP(idx, red_gamma), \
DT_INST_PROP(idx, green_gamma), \
DT_INST_PROP(idx, blue_gamma), \
}; \
\
static const struct is31fl3741_config is31fl3741_##idx##_config = { \ static const struct is31fl3741_config is31fl3741_##idx##_config = { \
.bus = DT_INST_BUS_LABEL(idx), \ .bus = DT_INST_BUS_LABEL(idx), \
.reg = DT_INST_REG_ADDR(idx), \ .reg = DT_INST_REG_ADDR(idx), \
@ -257,10 +263,11 @@ static const struct led_strip_driver_api is31fl3741_api = {
.gcc = IS31FL3741_GCC(idx), \ .gcc = IS31FL3741_GCC(idx), \
.sws = DT_INST_PROP(idx, sw_setting), \ .sws = DT_INST_PROP(idx, sw_setting), \
.rgb_map = is31fl3741_##idx##_rgb_map, \ .rgb_map = is31fl3741_##idx##_rgb_map, \
.gamma = is31fl3741_##idx##_gamma, \
}; \ }; \
\ \
DEVICE_AND_API_INIT(is31fl3741_##idx, DT_INST_LABEL(idx), &is31fl3741_init, \ DEVICE_DT_INST_DEFINE(idx, &is31fl3741_init, NULL, &is31fl3741_##idx##_data, \
&is31fl3741_##idx##_data, &is31fl3741_##idx##_config, POST_KERNEL, \ &is31fl3741_##idx##_config, POST_KERNEL, CONFIG_LED_STRIP_INIT_PRIORITY, \
CONFIG_LED_STRIP_INIT_PRIORITY, &is31fl3741_api); &is31fl3741_api);
DT_INST_FOREACH_STATUS_OKAY(IS31FL3741_DEVICE); DT_INST_FOREACH_STATUS_OKAY(IS31FL3741_DEVICE);

View file

@ -1,6 +0,0 @@
description: |
Driver for the IS31FL3741 LED matrix driver
compatible: "issi,issi_is31fl3741"
include: i2c-device.yaml

View file

@ -50,3 +50,36 @@ properties:
chain-length: chain-length:
type: int type: int
required: true
description: |
How many RGB LEDs are driven by the IC.
red-gamma:
type: array
required: false
default: [ 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 6, 6, 6, 6, 7, 7, 7, 7, 8, 8, 8, 8, 10, 10, 10, 10, 12, 12, 12, 12, 14, 14, 14, 14, 16, 16, 16, 16, 18, 18, 18, 18, 20, 20, 20, 20, 22, 22, 22, 22, 24, 24, 24, 24, 26, 26, 26, 26, 29, 29, 29, 29, 32, 32, 32, 32, 35, 35, 35, 35, 38, 38, 38, 38, 41, 41, 41, 41, 44, 44, 44, 44, 47, 47, 47, 47, 50, 50, 50, 50, 53, 53, 53, 53, 57, 57, 57, 57, 61, 61, 61, 61, 65, 65, 65, 65, 69, 69, 69, 69, 73, 73, 73, 73, 77, 77, 77, 77, 81, 81, 81, 81, 85, 85, 85, 85, 89, 89, 89, 89, 94, 94, 94, 94, 99, 99, 99, 99, 104, 104, 104, 104, 109, 109, 109, 109, 114, 114, 114, 114, 119, 119, 119, 119, 124, 124, 124, 124, 129, 129, 129, 129, 134, 134, 134, 134, 140, 140, 140, 140, 146, 146, 146, 146, 152, 152, 152, 152, 158, 158, 158, 158, 164, 164, 164, 164, 170, 170, 170, 170, 176, 176, 176, 176, 182, 182, 182, 182, 188, 188, 188, 188, 195, 195, 195, 195, 202, 202, 202, 202, 209, 209, 209, 209, 216, 216, 216, 216, 223, 223, 223, 223, 230, 230, 230, 230, 237, 237, 237, 237, 244, 244, 244, 244, 251, 251, 251, 251, 255, 255, 255, 255 ]
description: |
Gamma correction lookup values for the red channel.
The gamma values make the LED brightness seem more linear to human eyes.
Default values match the recommendation from the IC datasheet but note this may
or may not work for your particular LEDs.
green-gamma:
type: array
required: false
default: [ 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 6, 6, 6, 6, 7, 7, 7, 7, 8, 8, 8, 8, 10, 10, 10, 10, 12, 12, 12, 12, 14, 14, 14, 14, 16, 16, 16, 16, 18, 18, 18, 18, 20, 20, 20, 20, 22, 22, 22, 22, 24, 24, 24, 24, 26, 26, 26, 26, 29, 29, 29, 29, 32, 32, 32, 32, 35, 35, 35, 35, 38, 38, 38, 38, 41, 41, 41, 41, 44, 44, 44, 44, 47, 47, 47, 47, 50, 50, 50, 50, 53, 53, 53, 53, 57, 57, 57, 57, 61, 61, 61, 61, 65, 65, 65, 65, 69, 69, 69, 69, 73, 73, 73, 73, 77, 77, 77, 77, 81, 81, 81, 81, 85, 85, 85, 85, 89, 89, 89, 89, 94, 94, 94, 94, 99, 99, 99, 99, 104, 104, 104, 104, 109, 109, 109, 109, 114, 114, 114, 114, 119, 119, 119, 119, 124, 124, 124, 124, 129, 129, 129, 129, 134, 134, 134, 134, 140, 140, 140, 140, 146, 146, 146, 146, 152, 152, 152, 152, 158, 158, 158, 158, 164, 164, 164, 164, 170, 170, 170, 170, 176, 176, 176, 176, 182, 182, 182, 182, 188, 188, 188, 188, 195, 195, 195, 195, 202, 202, 202, 202, 209, 209, 209, 209, 216, 216, 216, 216, 223, 223, 223, 223, 230, 230, 230, 230, 237, 237, 237, 237, 244, 244, 244, 244, 251, 251, 251, 251, 255, 255, 255, 255 ]
description: |
Gamma correction lookup values for the red channel.
The gamma values make the LED brightness seem more linear to human eyes.
Default values match the recommendation from the IC datasheet but note this may
or may not work for your particular LEDs.
blue-gamma:
type: array
required: false
default: [ 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 6, 6, 6, 6, 7, 7, 7, 7, 8, 8, 8, 8, 10, 10, 10, 10, 12, 12, 12, 12, 14, 14, 14, 14, 16, 16, 16, 16, 18, 18, 18, 18, 20, 20, 20, 20, 22, 22, 22, 22, 24, 24, 24, 24, 26, 26, 26, 26, 29, 29, 29, 29, 32, 32, 32, 32, 35, 35, 35, 35, 38, 38, 38, 38, 41, 41, 41, 41, 44, 44, 44, 44, 47, 47, 47, 47, 50, 50, 50, 50, 53, 53, 53, 53, 57, 57, 57, 57, 61, 61, 61, 61, 65, 65, 65, 65, 69, 69, 69, 69, 73, 73, 73, 73, 77, 77, 77, 77, 81, 81, 81, 81, 85, 85, 85, 85, 89, 89, 89, 89, 94, 94, 94, 94, 99, 99, 99, 99, 104, 104, 104, 104, 109, 109, 109, 109, 114, 114, 114, 114, 119, 119, 119, 119, 124, 124, 124, 124, 129, 129, 129, 129, 134, 134, 134, 134, 140, 140, 140, 140, 146, 146, 146, 146, 152, 152, 152, 152, 158, 158, 158, 158, 164, 164, 164, 164, 170, 170, 170, 170, 176, 176, 176, 176, 182, 182, 182, 182, 188, 188, 188, 188, 195, 195, 195, 195, 202, 202, 202, 202, 209, 209, 209, 209, 216, 216, 216, 216, 223, 223, 223, 223, 230, 230, 230, 230, 237, 237, 237, 237, 244, 244, 244, 244, 251, 251, 251, 251, 255, 255, 255, 255 ]
description: |
Gamma correction lookup values for the red channel.
The gamma values make the LED brightness seem more linear to human eyes.
Default values match the recommendation from the IC datasheet but note this may
or may not work for your particular LEDs.

View file

@ -5,11 +5,10 @@
*/ */
/** /**
* Maps a 39x9 matrix cell index to a 1D array matching IS31FL3741's PWM registers order. * Maps a 39x9 matrix cell index to a 1D array matching IS31FL3741's PWN registers order.
*/ */
#define PIXEL(n) ( \ #define PIXEL(n) \
(((n) % 39) < 30) \ ((((n) % 39) < 30) ? ((((n) / 39) * 30) + ((n) % 39)) \
? ((((n) / 39) * 30) + ((n) % 39)) \
: (270 + (((n) / 39) * 9) + ((n) % 39) - 30)) : (270 + (((n) / 39) * 9) + ((n) % 39) - 30))
#define RGB(com, r, g, b) PIXEL(com + r) PIXEL(com + g) PIXEL(com + b) #define RGB(com, r, g, b) PIXEL(com + r) PIXEL(com + g) PIXEL(com + b)