partial fix to gpio stuff (limit what can be exported)
authorJeremy Tan <[email protected]>
Wed, 25 Sep 2013 12:50:33 +0000 (20:50 +0800)
committerJeremy Tan <[email protected]>
Wed, 25 Sep 2013 12:50:33 +0000 (20:50 +0800)
.gitignore
notes/pin maps/GPIO pin correspondence unrestricted.csv [new file with mode: 0644]
notes/pin maps/GPIO pin correspondence.csv [new file with mode: 0644]
notes/pin maps/GPIO pin correspondence.xls [new file with mode: 0644]
notes/pin maps/gpioindex_lut.py [new file with mode: 0644]
notes/pin maps/gpionums.csv [new file with mode: 0644]
notes/pin maps/parseit.py [new file with mode: 0644]
notes/pin maps/readme.txt [new file with mode: 0644]
server/bbb_pin.c
server/bbb_pin_defines.h
server/pin_test.c

index 74ede4e..729e81b 100644 (file)
@@ -11,5 +11,7 @@
 ehthumbs.db
 Thumbs.db
 
+__pycache__
+
 server/win32
 **/nbproject/private/
\ No newline at end of file
diff --git a/notes/pin maps/GPIO pin correspondence unrestricted.csv b/notes/pin maps/GPIO pin correspondence unrestricted.csv
new file mode 100644 (file)
index 0000000..c076e18
--- /dev/null
@@ -0,0 +1,50 @@
+P8_07,66
+P8_08,67
+P8_09,69
+P8_10,68
+P8_11,45
+P8_12,44
+P8_13,23
+P8_14,26
+P8_15,47
+P8_16,46
+P8_17,27
+P8_18,65
+P8_19,22
+P8_26,61
+P8_27,86
+P8_28,88
+P8_29,87
+P8_30,89
+P8_31,10
+P8_32,11
+P8_33,9
+P8_34,81
+P8_35,8
+P8_36,80
+P8_37,78
+P8_38,79
+P8_39,76
+P8_40,77
+P8_41,74
+P8_42,75
+P8_43,72
+P8_44,73
+P8_45,70
+P8_46,71
+P9_11,30
+P9_12,60
+P9_13,31
+P9_14,50
+P9_15,48
+P9_16,51
+P9_17,5
+P9_18,4
+P9_21,3
+P9_22,2
+P9_23,49
+P9_24,15
+P9_25,117
+P9_26,14
+P9_27,115
+P9_30,112
diff --git a/notes/pin maps/GPIO pin correspondence.csv b/notes/pin maps/GPIO pin correspondence.csv
new file mode 100644 (file)
index 0000000..ceb41a2
--- /dev/null
@@ -0,0 +1,65 @@
+P8_03,38
+P8_04,39
+P8_05,34
+P8_06,35
+P8_07,66
+P8_08,67
+P8_09,69
+P8_10,68
+P8_11,45
+P8_12,44
+P8_13,23
+P8_14,26
+P8_15,47
+P8_16,46
+P8_17,27
+P8_18,65
+P8_19,22
+P8_20,63
+P8_21,62
+P8_22,37
+P8_23,36
+P8_24,33
+P8_25,1
+P8_26,61
+P8_27,86
+P8_28,88
+P8_29,87
+P8_30,89
+P8_31,10
+P8_32,11
+P8_33,9
+P8_34,81
+P8_35,8
+P8_36,80
+P8_37,78
+P8_38,79
+P8_39,76
+P8_40,77
+P8_41,74
+P8_42,75
+P8_43,72
+P8_44,73
+P8_45,70
+P8_46,71
+P9_11,30
+P9_12,60
+P9_13,31
+P9_14,50
+P9_15,48
+P9_16,51
+P9_17,5
+P9_18,4
+P9_19,13
+P9_20,12
+P9_21,3
+P9_22,2
+P9_23,49
+P9_24,15
+P9_25,117
+P9_26,14
+P9_27,115
+P9_28,113
+P9_29,111
+P9_30,112
+P9_31,110
diff --git a/notes/pin maps/GPIO pin correspondence.xls b/notes/pin maps/GPIO pin correspondence.xls
new file mode 100644 (file)
index 0000000..3e7d55c
Binary files /dev/null and b/notes/pin maps/GPIO pin correspondence.xls differ
diff --git a/notes/pin maps/gpioindex_lut.py b/notes/pin maps/gpioindex_lut.py
new file mode 100644 (file)
index 0000000..14457d5
--- /dev/null
@@ -0,0 +1,17 @@
+import sys, re, os
+from parseit import printlut
+
+def doit2(x):
+    with open(x) as f:
+        lut = {}
+        i = 0
+        for line in f:
+            gpionum = int(line)
+            lut[gpionum] = i
+            i += 1
+
+        lutarr = []
+        for i in range(128):
+            lutarr.append(lut.get(i, 128))
+        return lutarr
+        
diff --git a/notes/pin maps/gpionums.csv b/notes/pin maps/gpionums.csv
new file mode 100644 (file)
index 0000000..d0a7697
--- /dev/null
@@ -0,0 +1,50 @@
+2
+3
+4
+5
+8
+9
+10
+11
+14
+15
+22
+23
+26
+27
+30
+31
+44
+45
+46
+47
+48
+49
+50
+51
+60
+61
+65
+66
+67
+68
+69
+70
+71
+72
+73
+74
+75
+76
+77
+78
+79
+80
+81
+86
+87
+88
+89
+112
+115
+117
diff --git a/notes/pin maps/parseit.py b/notes/pin maps/parseit.py
new file mode 100644 (file)
index 0000000..0aab5ba
--- /dev/null
@@ -0,0 +1,48 @@
+import sys, re, os
+#lut size of 93 (46 pins/header; 2 headers; padding for 1-indexed)
+
+def doit(x):
+    '''generate the lut from the csv'''
+    lut = {}
+    reverselut = {}
+    
+    with open(x) as f:
+        for line in f:
+            m = re.search("P(\d)_(\d+),(\d+)", line)
+            header = int(m.group(1))
+            pin = int(m.group(2))
+            gpionum = int(m.group(3))
+
+            if header==8:
+                header = 0
+            else:
+                header = 1
+
+            lut[header*46+pin] = gpionum
+            reverselut[gpionum] = header*46+pin
+    lutarr = []
+    reverselutarr =[]
+    
+    for i in range(0, 93):
+        lutarr.append(lut.get(i, 0))
+
+    for i in range(0, 128):
+        reverselutarr.append(reverselut.get(i, 0))
+        
+    return (lutarr, reverselutarr)
+
+def printlut(lut, name="g_gpio_lut"):
+    '''print the lut for C'''
+    rowsize = 14
+    print("const char %s[%d] = {" % (name, len(lut)))
+    low = 0
+    high = rowsize
+    for i in range(0, len(lut), rowsize):
+        print("\t", end="")
+        print(*("%3d" % g for g in lut[low:high]), sep=', ')
+        low = high
+        high += rowsize
+    print("}")
+
+
+        
diff --git a/notes/pin maps/readme.txt b/notes/pin maps/readme.txt
new file mode 100644 (file)
index 0000000..89e57b9
--- /dev/null
@@ -0,0 +1,3 @@
+GPIO Pin correspondence.xls -  all maps with descriptions
+GPIO pin correspondence unrestricted.csv - all unused pins + hdmi pins
+GPIO pin correspondence.csv - all gpio pins
\ No newline at end of file
index 4569578..d1e5a23 100644 (file)
@@ -52,21 +52,53 @@ static PWM_Pin g_pwm[PWM_NUM_PINS] = {{0}};
 
 static char g_buffer[BUFSIZ] = "";
 
+#define GPIO_LUT_SIZE 93
+#define GPIO_INDEX_SIZE 128
 
+/** 
+ * A lookup table from header number to GPIO pin number.
+ * e.g P8_13 is g_gpio_lut[0*46+13] = g_gpio_lut[13]
+ * e.g P9_13 is g_gpio_lut[1*46+13] = g_gpio_lut[59]
+ *
+ * Where the returned value is 0, there is no GPIO pin
+ * at that location.
+ */
+const unsigned char g_gpio_lut[GPIO_LUT_SIZE] = {
+         0,   0,   0,   0,   0,   0,   0,  66,  67,  69,  68,  45,  44,  23,
+        26,  47,  46,  27,  65,  22,   0,   0,   0,   0,   0,   0,  61,  86,
+        88,  87,  89,  10,  11,   9,  81,   8,  80,  78,  79,  76,  77,  74,
+        75,  72,  73,  70,  71,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+         0,  30,  60,  31,  50,  48,  51,   5,   4,   0,   0,   3,   2,  49,
+        15, 117,  14, 115,   0,   0, 112,   0,   0,   0,   0,   0,   0,   0,
+         0,   0,   0,   0,   0,   0,   0,   0,   0
+};
 
+/**
+ * Converts GPIO number to index into g_gpio, or 128 if no map.
+ */
+const unsigned char g_gpio_index[GPIO_INDEX_SIZE] = {
+       128, 128,   0,   1,   2,   3, 128, 128,   4,   5,   6,   7, 128, 128,
+         8,   9, 128, 128, 128, 128, 128, 128,  10,  11, 128, 128,  12,  13,
+       128, 128,  14,  15, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+       128, 128,  16,  17,  18,  19,  20,  21,  22,  23, 128, 128, 128, 128,
+       128, 128, 128, 128,  24,  25, 128, 128, 128,  26,  27,  28,  29,  30,
+        31,  32,  33,  34,  35,  36,  37,  38,  39,  40,  41,  42, 128, 128,
+       128, 128,  43,  44,  45,  46, 128, 128, 128, 128, 128, 128, 128, 128,
+       128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+        47, 128, 128,  48, 128,  49, 128, 128, 128, 128, 128, 128, 128, 128,
+       128, 128
+};
 
 /**
  * Export a GPIO pin and open the file descriptors
  */
 void GPIO_Export(int pin)
 {
-       if (pin < 0 || pin > GPIO_NUM_PINS)
+       if (pin < 0 || pin >= GPIO_INDEX_SIZE || g_gpio_index[pin] == 128)
        {
-               Abort("Invalid pin number %d", pin);
+               Abort("Not a useable pin (number %d)", pin);
        }
 
-       
-
        // Export the pin
        sprintf(g_buffer, "%s/export", GPIO_DEVICE_PATH);
        FILE * export = fopen(g_buffer, "w");
@@ -78,10 +110,11 @@ void GPIO_Export(int pin)
        fprintf(export, "%d", pin);     
        fclose(export);
        
+       GPIO_Pin *gpio = &g_gpio[g_gpio_index[pin]];
        // Setup direction file descriptor
        sprintf(g_buffer, "%s/gpio%d/direction", GPIO_DEVICE_PATH, pin);
-       g_gpio[pin].fd_direction = open(g_buffer, O_RDWR);
-       if (g_gpio[pin].fd_direction < 0)
+       gpio->fd_direction = open(g_buffer, O_RDWR);
+       if (gpio->fd_direction < 0)
        {
                Abort("Couldn't open %s for GPIO pin %d - %s", g_buffer, pin, strerror(errno));
        }
@@ -89,8 +122,8 @@ void GPIO_Export(int pin)
 
        // Setup value file descriptor
        sprintf(g_buffer, "%s/gpio%d/value", GPIO_DEVICE_PATH, pin);
-       g_gpio[pin].fd_value = open(g_buffer, O_RDWR);
-       if (g_gpio[pin].fd_value < 0)
+       gpio->fd_value = open(g_buffer, O_RDWR);
+       if (gpio->fd_value < 0)
        {
                Abort("Couldn't open %s for GPIO pin %d - %s", g_buffer, pin, strerror(errno));
        }
@@ -105,14 +138,15 @@ void GPIO_Export(int pin)
 void GPIO_Unexport(int pin)
 {
 
-       if (pin < 0 || pin > GPIO_NUM_PINS)
+       if (pin < 0 || pin >= GPIO_INDEX_SIZE || g_gpio_index[pin] == 128)
        {
-               Abort("Invalid pin number %d", pin);
+               Abort("Not a useable pin (number %d)", pin);
        }
 
+       GPIO_Pin *gpio = &g_gpio[g_gpio_index[pin]];
        // Close file descriptors
-       close(g_gpio[pin].fd_value);
-       close(g_gpio[pin].fd_direction);
+       close(gpio->fd_value);
+       close(gpio->fd_direction);
 
        // Unexport the pin
 
@@ -216,8 +250,6 @@ void PWM_Unexport(int pin)
        
        fprintf(export, "%d", pin);
        fclose(export);
-
-
 }
 
 /**
@@ -256,13 +288,19 @@ void ADC_Unexport()
  */
 void GPIO_Set(int pin, bool value)
 {
-       if (pwrite(g_gpio[pin].fd_direction, "out", 3, 0) != 3)
+       if (pin < 0 || pin >= GPIO_INDEX_SIZE || g_gpio_index[pin] == 128)
+       {
+               Abort("Not a useable pin (number %d)", pin);
+       }
+
+       GPIO_Pin *gpio = &g_gpio[g_gpio_index[pin]];
+       if (pwrite(gpio->fd_direction, "out", 3, 0) != 3)
        {
                Abort("Couldn't set GPIO %d direction - %s", pin, strerror(errno));
        }
 
        char c = '0' + (value);
-       if (pwrite(g_gpio[pin].fd_value, &c, 1, 0) != 1)
+       if (pwrite(gpio->fd_value, &c, 1, 0) != 1)
        {
                Abort("Couldn't read GPIO %d value - %s", pin, strerror(errno));
        }
@@ -275,10 +313,17 @@ void GPIO_Set(int pin, bool value)
  */
 bool GPIO_Read(int pin)
 {
-       if (pwrite(g_gpio[pin].fd_direction, "in", 2, 0) != 2)
+       if (pin < 0 || pin >= GPIO_INDEX_SIZE || g_gpio_index[pin] == 128)
+       {
+               Log(LOGERR, "Not a useable pin (number %d)", pin);
+               return false;
+       }
+
+       GPIO_Pin *gpio = &g_gpio[g_gpio_index[pin]];
+       if (pwrite(gpio->fd_direction, "in", 2, 0) != 2)
                Log(LOGERR,"Couldn't set GPIO %d direction - %s", pin, strerror(errno)); 
        char c = '0';
-       if (pread(g_gpio[pin].fd_value, &c, 1, 0) != 1)
+       if (pread(gpio->fd_value, &c, 1, 0) != 1)
                Log(LOGERR,"Couldn't read GPIO %d value - %s", pin, strerror(errno));
 
        return (c == '1');
@@ -294,6 +339,15 @@ bool GPIO_Read(int pin)
  */
 void PWM_Set(int pin, bool polarity, long period, long duty)
 {
+       Log(LOGDEBUG, "Pin %d, pol %d, period: %lu, duty: %lu", pin, polarity, period, duty);
+       
+       rewind(g_pwm[pin].file_duty);
+
+       if (fprintf(g_pwm[pin].file_duty, "0") == 0)
+       {
+               Abort("Couldn't zero the duty cycle for PWM %d - s", pin, strerror(errno));
+       }
+       
        // Have to stop PWM before changing it
        if (pwrite(g_pwm[pin].fd_run, "0", 1, 0) != 1)
        {
@@ -308,15 +362,16 @@ void PWM_Set(int pin, bool polarity, long period, long duty)
        
        rewind(g_pwm[pin].file_period); 
        rewind(g_pwm[pin].file_duty);
+       if (fprintf(g_pwm[pin].file_period, "%lu", period) == 0)
+       {
+               Abort("Couldn't set period for PWM %d - %s", pin, strerror(errno));
+       }
 
        if (fprintf(g_pwm[pin].file_duty, "%lu", duty) == 0)
        {
                Abort("Couldn't set duty cycle for PWM %d - %s", pin, strerror(errno));
        }
-       if (fprintf(g_pwm[pin].file_period, "%lu", period) == 0)
-       {
-               Abort("Couldn't set period for PWM %d - %s", pin, strerror(errno));
-       }
+
        if (pwrite(g_pwm[pin].fd_run, "1", 1, 0) != 1)
        {
                Abort("Couldn't start PWM %d - %s", pin, strerror(errno));
index dba2d5c..661f969 100644 (file)
@@ -9,9 +9,9 @@
 /** GPIO0 defines **/
 
 #define GPIO0_1 1
-#define GPIO0_2 2
-//#define GPIO0_3 3 // Used for PWM
-//#define GPIO0_4 4 // Used for PWM
+#define GPIO0_2 2 // Used for PWM
+#define GPIO0_3 3 // Used for PWM
+#define GPIO0_4 4 
 #define GPIO0_5 5
 #define GPIO0_6 6
 #define GPIO0_7 7
 #define GPIO2_31 95
 #define GPIO2_32 96
 
-/** Number of GPIO pins **/
-#define GPIO_NUM_PINS 97
+/** Number of useable GPIO pins **/
+#define GPIO_NUM_PINS 50
 
 /** Export path **/
 #define GPIO_DEVICE_PATH "/sys/class/gpio"
index 3ccf458..ca857ec 100644 (file)
  */
 void Pin_Init()
 {
-/*     for (int i = 0; i < GPIO_NUM_PINS; ++i)
+       for (int i = 0; i < 128; ++i)
                GPIO_Export(i);
 
        for (int i = 0; i < ADC_NUM_PINS; ++i)
                ADC_Export();
-*/
+
        for (int i = 0; i < PWM_NUM_PINS; ++i)
                PWM_Export(i);
 }

UCC git Repository :: git.ucc.asn.au