Add sysled support
authorMiroslav Ondra <ondra@faster.cz>
Wed, 22 Jan 2020 12:53:24 +0000 (13:53 +0100)
committerMiroslav Ondra <ondra@faster.cz>
Wed, 22 Jan 2020 12:53:24 +0000 (13:53 +0100)
modules/unipi/src/unipi_common.h
modules/unipi/src/unipi_misc.c
modules/unipi/src/unipi_misc.h
modules/unipi/src/unipi_platform.c
modules/unipi/src/unipi_platform.h

index 5cd0505ea9d8d7164204a8125f762f7a68f764ef..84320ed16454b8662a30a0aff070cb8de48fe8dc 100644 (file)
@@ -52,7 +52,7 @@
 #if NEURONSPI_SCHED_REQUIRED > 0
        #include <uapi/linux/sched/types.h>
 #endif
-#define NEURONSPI_MAJOR_VERSIONSTRING "Version 1.33:2019:09:26"
+#define NEURONSPI_MAJOR_VERSIONSTRING "Version 1.33:2020:01:22"
 
 #define NEURONSPI_MAX_DEVS                             3
 #define NEURONSPI_MAX_UART                             16
@@ -65,6 +65,8 @@
 #define NEURONSPI_DEFAULT_FREQ                 600000
 #define NEURONSPI_COMMON_FREQ                  12000000
 
+#define NEURONSPI_SYSLED_REGISTER      509
+
 #if defined(CONFIG_ARM64)
 /* on NanoPi there are only 12MHz and 6MHz available, not in between */
    #define NEURONSPI_SLOWER_FREQ                       6000000
index dc286a57855065e9e86d49294c176d0b3d4b33b1..f774f29efe480243635ecc9d3c499fef16fa217b 100644 (file)
@@ -51,12 +51,13 @@ void neuronspi_led_set_brightness(struct led_classdev *ldev, enum led_brightness
 
 
 
-struct neuronspi_led_driver * neuronspi_led_probe(int led_count, int neuron_index, struct platform_device *board_device)
+struct neuronspi_led_driver * neuronspi_led_probe(int uled_count, int sysled_count, int neuron_index, struct platform_device *board_device)
 {
     struct spi_device* spi = neuronspi_s_dev[neuron_index];
        struct neuronspi_driver_data *n_spi = spi_get_drvdata(spi);
        struct neuronspi_led_driver * led_driver = kzalloc(sizeof(struct neuronspi_led_driver) * led_count, GFP_ATOMIC);
        int i, coil;
+    int led_count = uled_count + sysled_count;
 
        if (n_spi->features != NULL) {
                coil = n_spi->features->di_count + n_spi->features->do_count + n_spi->features->ro_count;
@@ -65,7 +66,11 @@ struct neuronspi_led_driver * neuronspi_led_probe(int led_count, int neuron_inde
        }
        
        for (i = 0; i < led_count; i++) {
-               scnprintf(led_driver[i].name, sizeof(led_driver[i].name), "unipi:green:uled-x%x", i);
+        if (i < uled_count) {
+                       scnprintf(led_driver[i].name, sizeof(led_driver[i].name), "unipi:green:uled-x%x", i);
+               { else {
+                       scnprintf(led_driver[i].name, sizeof(led_driver[i].name), "unipi:green:sysled-x%x", i-uled_count);
+               }
                // Initialise the rest of the structure
                led_driver[i].id = i;
                led_driver[i].coil = coil+i;
index 6305ec2552eb39f4e53c7d92b79339c04e086665..2a0ba68eaefb22719eaea2be0d105df82057e00d 100644 (file)
@@ -41,6 +41,6 @@ struct neuronspi_led_driver
 
 void neuronspi_led_proc(struct kthread_work *ws);
 void neuronspi_led_set_brightness(struct led_classdev *ldev, enum led_brightness brightness);
-struct neuronspi_led_driver * neuronspi_led_probe(int led_count, int neuron_index, struct platform_device *board_device);
+struct neuronspi_led_driver * neuronspi_led_probe(int uled_count, int sysled_count, int neuron_index, struct platform_device *board_device);
 
 #endif /* MODULES_NEURON_SPI_SRC_UNIPI_MISC_H_ */
index e49759d3d5a7183209f7866ad65e9296d233b0dc..856165aabaf6fe97ef03781b35d2754e7e46ff68 100644 (file)
@@ -92,7 +92,7 @@ static u32 NEURONSPI_BOARD_B1000_HW_DEFINITION_BLOCK[NEURONSPI_BOARD_B1000_HW_DE
                .ro_count =                                       0,    \
                .ds_count =                                       4,    \
                .di_count =                                       4,    \
-               .led_count =                             16,    \
+               .led_count =                              4,    \
                .stm_ai_count =                           1,    \
                .stm_ao_count =                           1,    \
                .sec_ai_count =                           0,    \
@@ -104,6 +104,7 @@ static u32 NEURONSPI_BOARD_B1000_HW_DEFINITION_BLOCK[NEURONSPI_BOARD_B1000_HW_DE
                .extension_sys_count =            0,    \
                .light_count =                            0,    \
                .owire_count =                            1,    \
+               .sysled_count =                          16,    \
 }
 
 #define NEURONSPI_BOARD_B1000_HW_DEFINITION { \
@@ -182,6 +183,7 @@ static u32 NEURONSPI_BOARD_E8DI8RO_HW_DEFINITION_BLOCK[NEURONSPI_BOARD_E8DI8RO_H
                .extension_sys_count =            0,    \
                .light_count =                            0,    \
                .owire_count =                            0,    \
+               .sysled_count =                           0,    \
 }
 
 #define NEURONSPI_BOARD_E8DI8RO_HW_DEFINITION { \
@@ -233,6 +235,7 @@ static u32 NEURONSPI_BOARD_E14RO_HW_DEFINITION_BLOCK[NEURONSPI_BOARD_E14RO_HW_DE
                .extension_sys_count =            0,    \
                .light_count =                            0,    \
                .owire_count =                            0,    \
+               .sysled_count =                           0,    \
 }
 
 #define NEURONSPI_BOARD_E14RO_HW_DEFINITION { \
@@ -331,6 +334,7 @@ static u32 NEURONSPI_BOARD_E16DI_HW_DEFINITION_BLOCK[NEURONSPI_BOARD_E16DI_HW_DE
                .extension_sys_count =            0,    \
                .light_count =                            0,    \
                .owire_count =                            0,    \
+               .sysled_count =                           0,    \
 }
 
 #define NEURONSPI_BOARD_E16DI_HW_DEFINITION { \
@@ -412,6 +416,7 @@ static u32 NEURONSPI_BOARD_E8DI8ROP11DIR485_HW_DEFINITION_BLOCK[NEURONSPI_BOARD_
                .extension_sys_count =            1,    \
                .light_count =                            0,    \
                .owire_count =                            0,    \
+               .sysled_count =                           0,    \
 }
 
 #define NEURONSPI_BOARD_E8DI8ROP11DIR485_HW_DEFINITION { \
@@ -517,6 +522,7 @@ static u32 NEURONSPI_BOARD_E14ROP11DIR485_HW_DEFINITION_BLOCK[NEURONSPI_BOARD_E1
                .extension_sys_count =            1,    \
                .light_count =                            0,    \
                .owire_count =                            0,    \
+               .sysled_count =                           0,    \
 }
 
 #define NEURONSPI_BOARD_E14ROP11DIR485_HW_DEFINITION { \
@@ -643,6 +649,7 @@ static u32 NEURONSPI_BOARD_E16DIP11DIR485_HW_DEFINITION_BLOCK[NEURONSPI_BOARD_E1
                .extension_sys_count =            1,    \
                .light_count =                            0,    \
                .owire_count =                            0,    \
+               .sysled_count =                           0,    \
 }
 
 #define NEURONSPI_BOARD_E16DIP11DIR485_HW_DEFINITION { \
@@ -694,6 +701,7 @@ static u32 NEURONSPI_BOARD_E14ROU14RO_HW_DEFINITION_BLOCK[NEURONSPI_BOARD_E14ROU
                .extension_sys_count =            1,    \
                .light_count =                            0,    \
                .owire_count =                            0,    \
+               .sysled_count =                           0,    \
 }
 
 #define NEURONSPI_BOARD_E14ROU14RO_HW_DEFINITION { \
@@ -796,6 +804,7 @@ static u32 NEURONSPI_BOARD_E16DIU14RO_HW_DEFINITION_BLOCK[NEURONSPI_BOARD_E16DIU
                .extension_sys_count =            0,    \
                .light_count =                            0,    \
                .owire_count =                            0,    \
+               .sysled_count =                           0,    \
 }
 
 #define NEURONSPI_BOARD_E16DIU14RO_HW_DEFINITION { \
@@ -892,6 +901,7 @@ static u32 NEURONSPI_BOARD_E14ROU14DI_HW_DEFINITION_BLOCK[NEURONSPI_BOARD_E14ROU
                .extension_sys_count =            0,    \
                .light_count =                            0,    \
                .owire_count =                            0,    \
+               .sysled_count =                           0,    \
 }
 
 #define NEURONSPI_BOARD_E14ROU14DI_HW_DEFINITION { \
@@ -1034,6 +1044,7 @@ static u32 NEURONSPI_BOARD_E16DIU14DI_HW_DEFINITION_BLOCK[NEURONSPI_BOARD_E16DIU
                .extension_sys_count =            0,    \
                .light_count =                            0,    \
                .owire_count =                            0,    \
+               .sysled_count =                           0,    \
 }
 
 #define NEURONSPI_BOARD_E16DIU14DI_HW_DEFINITION { \
@@ -1099,6 +1110,7 @@ static u32 NEURONSPI_BOARD_E4AI4AO_HW_DEFINITION_BLOCK[NEURONSPI_BOARD_E4AI4AO_H
                .extension_sys_count =            0,    \
                .light_count =                            0,    \
                .owire_count =                            0,    \
+               .sysled_count =                           16,   \
 }
 
 
@@ -1190,6 +1202,7 @@ static u32 NEURONSPI_BOARD_E4AI4AOP6DI5RO_HW_DEFINITION_BLOCK[NEURONSPI_BOARD_E4
                .extension_sys_count =            1,    \
                .light_count =                            0,    \
                .owire_count =                            0,    \
+               .sysled_count =                           0,    \
 }
 
 #define NEURONSPI_BOARD_E4AI4AOP6DI5RO_HW_DEFINITION { \
@@ -1239,6 +1252,7 @@ static u32 NEURONSPI_BOARD_B485_HW_DEFINITION_BLOCK[NEURONSPI_BOARD_B485_HW_DEFI
        .extension_sys_count =            0,    \
        .light_count =                            0,    \
        .owire_count =                            0,    \
+       .sysled_count =                           0,    \
 }
 
 #define NEURONSPI_BOARD_B485_HW_DEFINITION { \
@@ -1308,6 +1322,7 @@ static u32 NEURONSPI_BOARD_E4LIGHT_HW_DEFINITION_BLOCK[NEURONSPI_BOARD_E4LIGHT_H
        .extension_sys_count =            0,    \
        .light_count =                            4,    \
        .owire_count =                            0,    \
+       .sysled_count =                          16,    \
 }
 
 #define NEURONSPI_BOARD_E4LIGHT_HW_DEFINITION { \
@@ -1398,6 +1413,7 @@ static u32 NEURONSPI_BOARD_E4AI4AOU6DI5RO_HW_DEFINITION_BLOCK[NEURONSPI_BOARD_E4
        .extension_sys_count =            0,    \
        .light_count =                            0,    \
        .owire_count =                            0,    \
+       .sysled_count =                           0,    \
 }
 
 #define NEURONSPI_BOARD_E4AI4AOU6DI5RO_HW_DEFINITION { \
@@ -1482,6 +1498,7 @@ static u32 NEURONSPI_BOARD_E4AI4AOP4DI5RO_HW_DEFINITION_BLOCK[NEURONSPI_BOARD_E4
                .extension_sys_count =            1,    \
                .light_count =                            0,    \
                .owire_count =                            0,    \
+               .sysled_count =                           0,    \
 }
 
 #define NEURONSPI_BOARD_E4AI4AOP4DI5RO_HW_DEFINITION { \
@@ -1566,6 +1583,7 @@ static u32 NEURONSPI_BOARD_E4AI4AOU4DI5RO_HW_DEFINITION_BLOCK[NEURONSPI_BOARD_E4
        .extension_sys_count =            0,    \
        .light_count =                            0,    \
        .owire_count =                            0,    \
+       .sysled_count =                           0,    \
 }
 
 #define NEURONSPI_BOARD_E4AI4AOU4DI5RO_HW_DEFINITION { \
@@ -2037,6 +2055,9 @@ int neuronspi_create_reg_starts(struct neuronspi_board_regstart_table *out_table
        if (board->features.led_count > 0) {
                out_table->led_val_reg = neuronspi_find_reg_start(board, NEURONSPI_REGFUN_LED_RW);
        }
+       if (board->features.sysled_count > 0) {
+               out_table->sysled_val_reg = NEURONSPI_SYSLED_REGISTER;
+       }
        if (board->features.light_count > 0) {
                // TODO: Fill in light bus registers
        }
@@ -2275,9 +2296,10 @@ struct platform_device * neuronspi_board_device_probe(struct neuronspi_driver_da
        platform_set_drvdata(board_device, board_data);
 
        if (n_spi->features) {
-               if (n_spi->features->led_count) {
-                       printk(KERN_INFO "UNIPISPI: %d User LEDs detected at nspi%d\n", n_spi->features->led_count, n_spi->neuron_index);
-                       board_data->led_driver = neuronspi_led_probe(n_spi->features->led_count, n_spi->neuron_index, board_device);
+               if ((n_spi->features->led_count>0) || (n_spi->features->sysled_count>0)) {
+                       if (n_spi->features->led_count) printk(KERN_INFO "UNIPISPI: %d User LEDs detected at nspi%d\n", n_spi->features->led_count, n_spi->neuron_index);
+                       if (n_spi->features->sysled_count) printk(KERN_INFO "UNIPISPI: %d System LEDs detected at nspi%d\n", n_spi->features->sysled_count, n_spi->neuron_index);
+                       board_data->led_driver = neuronspi_led_probe(n_spi->features->led_count, n_spi->features->sysled_count, n_spi->neuron_index, board_device);
                }
 #ifdef CONFIG_GPIOLIB
                if (n_spi->features->di_count) {
index 0b219265fb85d9c7f7641960f156188942de3171..c90f69a9206702a94d4a5d4a605e813eacb77978 100644 (file)
@@ -62,6 +62,7 @@ struct neuronspi_board_features
        u32             extension_sys_count;
        u32             light_count;
        u32             owire_count;
+       u32             sysled_count;
 };
 
 struct neuronspi_board_regstart_table
@@ -114,6 +115,8 @@ struct neuronspi_board_regstart_table
        u32             sys_hw_ver;
        u32             sys_hw_flash_ver;
        u32             sys_sw_ver;
+       u32             sysled_val_coil;
+       u32             sysled_val_reg;
 };
 
 struct neuronspi_board_combination