1
0
mirror of https://github.com/xtacocorex/CHIP_IO synced 2025-07-20 12:53:22 +00:00

7 Commits

13 changed files with 304 additions and 223 deletions

View File

@ -1,3 +1,19 @@
0.3.0
----
* Added setmode() function for GPIO to maintain compatibility with Raspberry Pi scripts, this function literally does nothing
* Added per pin cleanup functionality for GPIO and SoftPWM so you can unexport a pin without unexporting every pin
* Updated README to make edge detection wording a little better and to add the per pin cleanup code
* Version update since I blasted through 3 issues on github and feel like we need a nice bump to 0.3
0.2.7
----
* Fix to the Enable 1.8V Pin code as it wasn't working due to bit shifting isn't allowed on a float.
* Updated README to denote the PocketCHIP Pin names better
0.2.6
----
* Fix to keep the GPIO value file open until the pin is unexported (issue #34)
0.2.5
----
* Updates to the pytest code for HWPWM and SoftPWM

View File

@ -35,7 +35,7 @@ def set_1v8_pin_voltage(voltage):
return False
if voltage < 1.8 or voltage > 3.3:
return False
voltage=round((voltage - 1.8) / 0.1) << 4
voltage=int(round((voltage - 1.8) / 0.1)) << 4
if subprocess.call(["/usr/sbin/i2cset", "-f", "-y" ,"0", "0x34", "0x90", "0x03"]):
return False
if subprocess.call(["/usr/sbin/i2cset", "-f", "-y", "0", "0x34", "0x91", str(voltage)]):

View File

@ -6,7 +6,7 @@ publish: package
clean:
rm -rf CHIP_IO.* build dist
rm -f *.pyo
rm -f *.pyo *.pyc
rm -f *.egg
rm -f overlays/*.pyo overlays/*.pyc
tests:

View File

@ -44,115 +44,115 @@ All scripts that require GPIO, PWM (HW and/or SW), and Overlay Manager need to b
**Allowable Pin Names for the Library**
The following "table" is the allowable pin names that are able to be used by the library.
The following "table" is the allowable pin names that are able to be used by the library. The Name column is the normal name used on the CHIP Headers, the Alt Name column is the value used by the PocketCHIP header (if it's broken out), and the Key is the Header and Pin Number the the Pin is physically located. Either of these 3 means is able to specify a pin in CHIP_IO.
+-----------+-------------+--------+
| Name | Alt Name | Key |
+-----------+-------------+--------+
| TWI1-SDA | KPD-I2C-SDA | U13_9 |
+-----------+-------------+--------+
| TWI1-SCK | KPD-I2C-SCL | U13_11 |
+-----------+-------------+--------+
| LCD-D2 | LCD-D2 | U13_17 |
+-----------+-------------+--------+
| PWM0 | PWM0 | U13_18 |
+-----------+-------------+--------+
| LCD-D4 | LCD-D4 | U13_19 |
+-----------+-------------+--------+
| LCD-D3 | LCD-D3 | U13_20 |
+-----------+-------------+--------+
| LCD-D6 | LCD-D6 | U13_21 |
+-----------+-------------+--------+
| LCD-D5 | LCD-D5 | U13_22 |
+-----------+-------------+--------+
| LCD-D10 | LCD-D10 | U13_23 |
+-----------+-------------+--------+
| LCD-D7 | LCD-D7 | U13_24 |
+-----------+-------------+--------+
| LCD-D12 | LCD-D12 | U13_25 |
+-----------+-------------+--------+
| LCD-D11 | LCD-D11 | U13_26 |
+-----------+-------------+--------+
| LCD-D14 | LCD-D14 | U13_27 |
+-----------+-------------+--------+
| LCD-D13 | LCD-D13 | U13_28 |
+-----------+-------------+--------+
| LCD-D18 | LCD-D18 | U13_29 |
+-----------+-------------+--------+
| LCD-D15 | LCD-D15 | U13_30 |
+-----------+-------------+--------+
| LCD-D20 | LCD-D20 | U13_31 |
+-----------+-------------+--------+
| LCD-D19 | LCD-D19 | U13_32 |
+-----------+-------------+--------+
| LCD-D22 | LCD-D22 | U13_33 |
+-----------+-------------+--------+
| LCD-D21 | LCD-D21 | U13_34 |
+-----------+-------------+--------+
| LCD-CLK | LCD-CLK | U13_35 |
+-----------+-------------+--------+
| LCD-D23 | LCD-D23 | U13_36 |
+-----------+-------------+--------+
| LCD-VSYNC | LCD-VSYNC | U13_37 |
+-----------+-------------+--------+
| LCD-HSYNC | LCD-HSYNC | U13_38 |
+-----------+-------------+--------+
| LCD-DE | LCD-DE | U13_40 |
+-----------+-------------+--------+
| UART1-TX | UART-TX | U14_3 |
+-----------+-------------+--------+
| UART1-RX | UART-RX | U14_5 |
+-----------+-------------+--------+
| LRADC | ADC | U14_11 |
+-----------+-------------+--------+
| XIO-P0 | XIO-P0 | U14_13 |
+-----------+-------------+--------+
| XIO-P1 | XIO-P1 | U14_14 |
+-----------+-------------+--------+
| XIO-P2 | GPIO1 | U14_15 |
+-----------+-------------+--------+
| XIO-P3 | GPIO2 | U14_16 |
+-----------+-------------+--------+
| XIO-P4 | GPIO3 | U14_17 |
+-----------+-------------+--------+
| XIO-P5 | GPIO4 | U14_18 |
+-----------+-------------+--------+
| XIO-P6 | GPIO5 | U14_19 |
+-----------+-------------+--------+
| XIO-P7 | GPIO6 | U14_20 |
+-----------+-------------+--------+
| AP-EINT1 | KPD-INT | U14_23 |
+-----------+-------------+--------+
| AP-EINT3 | AP-INT3 | U14_24 |
+-----------+-------------+--------+
| TWI2-SDA | I2C-SDA | U14_25 |
+-----------+-------------+--------+
| TWI2-SCK | I2C-SCL | U14_26 |
+-----------+-------------+--------+
| CSIPCK | SPI-SEL | U14_27 |
+-----------+-------------+--------+
| CSICK | SPI-CLK | U14_28 |
+-----------+-------------+--------+
| CSIHSYNC | SPI-MOSI | U14_29 |
+-----------+-------------+--------+
| CSIVSYNC | SPI-MISO | U14_30 |
+-----------+-------------+--------+
| CSID0 | CSID0 | U14_31 |
+-----------+-------------+--------+
| CSID1 | CSID1 | U14_32 |
+-----------+-------------+--------+
| CSID2 | CSID2 | U14_33 |
+-----------+-------------+--------+
| CSID3 | CSID3 | U14_34 |
+-----------+-------------+--------+
| CSID4 | CSID4 | U14_35 |
+-----------+-------------+--------+
| CSID5 | CSID5 | U14_36 |
+-----------+-------------+--------+
| CSID6 | CSID6 | U14_37 |
+-----------+-------------+--------+
| CSID7 | CSID7 | U14_38 |
+-----------+-------------+--------+
+------------------+--------------------------+--------+
| CHIP (Name) | PocketCHIP (Alt Name) | Key |
+------------------+--------------------------+--------+
| TWI1-SDA | KPD-I2C-SDA | U13_9 |
+------------------+--------------------------+--------+
| TWI1-SCK | KPD-I2C-SCL | U13_11 |
+------------------+--------------------------+--------+
| LCD-D2 | LCD-D2 | U13_17 |
+------------------+--------------------------+--------+
| PWM0 | PWM0 | U13_18 |
+------------------+--------------------------+--------+
| LCD-D4 | LCD-D4 | U13_19 |
+------------------+--------------------------+--------+
| LCD-D3 | LCD-D3 | U13_20 |
+------------------+--------------------------+--------+
| LCD-D6 | LCD-D6 | U13_21 |
+------------------+--------------------------+--------+
| LCD-D5 | LCD-D5 | U13_22 |
+------------------+--------------------------+--------+
| LCD-D10 | LCD-D10 | U13_23 |
+------------------+--------------------------+--------+
| LCD-D7 | LCD-D7 | U13_24 |
+------------------+--------------------------+--------+
| LCD-D12 | LCD-D12 | U13_25 |
+------------------+--------------------------+--------+
| LCD-D11 | LCD-D11 | U13_26 |
+------------------+--------------------------+--------+
| LCD-D14 | LCD-D14 | U13_27 |
+------------------+--------------------------+--------+
| LCD-D13 | LCD-D13 | U13_28 |
+------------------+--------------------------+--------+
| LCD-D18 | LCD-D18 | U13_29 |
+------------------+--------------------------+--------+
| LCD-D15 | LCD-D15 | U13_30 |
+------------------+--------------------------+--------+
| LCD-D20 | LCD-D20 | U13_31 |
+------------------+--------------------------+--------+
| LCD-D19 | LCD-D19 | U13_32 |
+------------------+--------------------------+--------+
| LCD-D22 | LCD-D22 | U13_33 |
+------------------+--------------------------+--------+
| LCD-D21 | LCD-D21 | U13_34 |
+------------------+--------------------------+--------+
| LCD-CLK | LCD-CLK | U13_35 |
+------------------+--------------------------+--------+
| LCD-D23 | LCD-D23 | U13_36 |
+------------------+--------------------------+--------+
| LCD-VSYNC | LCD-VSYNC | U13_37 |
+------------------+--------------------------+--------+
| LCD-HSYNC | LCD-HSYNC | U13_38 |
+------------------+--------------------------+--------+
| LCD-DE | LCD-DE | U13_40 |
+------------------+--------------------------+--------+
| UART1-TX | UART-TX | U14_3 |
+------------------+--------------------------+--------+
| UART1-RX | UART-RX | U14_5 |
+------------------+--------------------------+--------+
| LRADC | ADC | U14_11 |
+------------------+--------------------------+--------+
| XIO-P0 | XIO-P0 | U14_13 |
+------------------+--------------------------+--------+
| XIO-P1 | XIO-P1 | U14_14 |
+------------------+--------------------------+--------+
| XIO-P2 | GPIO1 | U14_15 |
+------------------+--------------------------+--------+
| XIO-P3 | GPIO2 | U14_16 |
+------------------+--------------------------+--------+
| XIO-P4 | GPIO3 | U14_17 |
+------------------+--------------------------+--------+
| XIO-P5 | GPIO4 | U14_18 |
+------------------+--------------------------+--------+
| XIO-P6 | GPIO5 | U14_19 |
+------------------+--------------------------+--------+
| XIO-P7 | GPIO6 | U14_20 |
+------------------+--------------------------+--------+
| AP-EINT1 | KPD-INT | U14_23 |
+------------------+--------------------------+--------+
| AP-EINT3 | AP-INT3 | U14_24 |
+------------------+--------------------------+--------+
| TWI2-SDA | I2C-SDA | U14_25 |
+------------------+--------------------------+--------+
| TWI2-SCK | I2C-SCL | U14_26 |
+------------------+--------------------------+--------+
| CSIPCK | SPI-SEL | U14_27 |
+------------------+--------------------------+--------+
| CSICK | SPI-CLK | U14_28 |
+------------------+--------------------------+--------+
| CSIHSYNC | SPI-MOSI | U14_29 |
+------------------+--------------------------+--------+
| CSIVSYNC | SPI-MISO | U14_30 |
+------------------+--------------------------+--------+
| CSID0 | CSID0 | U14_31 |
+------------------+--------------------------+--------+
| CSID1 | CSID1 | U14_32 |
+------------------+--------------------------+--------+
| CSID2 | CSID2 | U14_33 |
+------------------+--------------------------+--------+
| CSID3 | CSID3 | U14_34 |
+------------------+--------------------------+--------+
| CSID4 | CSID4 | U14_35 |
+------------------+--------------------------+--------+
| CSID5 | CSID5 | U14_36 |
+------------------+--------------------------+--------+
| CSID6 | CSID6 | U14_37 |
+------------------+--------------------------+--------+
| CSID7 | CSID7 | U14_38 |
+------------------+--------------------------+--------+
**GPIO Setup**
@ -191,12 +191,12 @@ Polling inputs::
else:
print("LOW")
The edge detection code below only works for the AP-EINT1, AP-EINT3, and XPO Pins on the CHIP.
Waiting for an edge (GPIO.RISING, GPIO.FALLING, or GPIO.BOTH::
GPIO.wait_for_edge(channel, GPIO.RISING)
This only works for the AP-EINT1, AP-EINT3, and XPO Pins on the CHIP
Detecting events::
GPIO.setup("XIO-P0", GPIO.IN)
@ -206,11 +206,16 @@ Detecting events::
if GPIO.event_detected("XIO-P0"):
print "event detected!"
CHIP_IO can also handle adding callback functions on any pin that supports edge detection.
**GPIO Cleanup**
To clean up the GPIO when done, do the following::
# Clean up every exported GPIO Pin
GPIO.cleanup()
# Clean up a single pin (keeping everything else intact)
GPIO.cleanup("XIO-P0")
**PWM**::
@ -239,7 +244,10 @@ Hardware PWM requires a DTB Overlay loaded on the CHIP to allow the kernel to kn
SPWM.set_frequency("XIO-P7", 10)
# To Stop SPWM
SPWM.stop("XIO-P7")
# Cleanup can have no argument to clean up all SoftPWM outputs
SPWM.cleanup()
# Or you can specify a single SoftPWM output to cleanup (keeping the rest intact)
SPWM.cleanup("XIO-P7")
#For specific polarity: this example sets polarity to 1 on start:
SPWM.start("XIO-P7", 50, 2000, 1)

View File

@ -7,7 +7,6 @@ import sys
def compile():
print("Compiling DTS Files")
call(["dtc", "-O", "dtb", "-o", "overlays/chip-spi2.dtbo", "-b", "o", "-@", "overlays/chip-spi2.dts"])
call(["dtc", "-O", "dtb", "-o", "overlays/chip-i2c1.dtbo", "-b", "o", "-@", "overlays/chip-i2c1.dts"])
call(["dtc", "-O", "dtb", "-o", "overlays/chip-pwm0.dtbo", "-b", "o", "-@", "overlays/chip-pwm0.dts"])
def copy():
@ -22,5 +21,4 @@ def copy():
os.remove(fl)
print("Moving DTBO files to "+overlay_path)
shutil.move("overlays/chip-spi2.dtbo", overlay_path+"/chip-spi2.dtbo")
shutil.move("overlays/chip-i2c1.dtbo", overlay_path+"/chip-i2c1.dtbo")
shutil.move("overlays/chip-pwm0.dtbo", overlay_path+"/chip-pwm0.dtbo")

View File

@ -20,7 +20,7 @@ classifiers = ['Development Status :: 3 - Alpha',
'Topic :: System :: Hardware']
setup(name = 'CHIP_IO',
version = '0.2.5',
version = '0.3.0',
author = 'Robert Wolterman',
author_email = 'robert.wolterman@gmail.com',
description = 'A module to control CHIP IO channels',

View File

@ -50,87 +50,87 @@ int setup_error = 0;
int module_setup = 0;
pins_t pins_info[] = {
{ "GND", "GND", "U13_1", -1, BASE_METHOD_AS_IS, -1, -1},
{ "CHG-IN", "CHG-IN", "U13_2", -1, BASE_METHOD_AS_IS, -1, -1},
{ "VCC-5V", "VCC-5V", "U13_3", -1, BASE_METHOD_AS_IS, -1, -1},
{ "GND", "GND", "U13_4", -1, BASE_METHOD_AS_IS, -1, -1},
{ "VCC-3V3", "VCC-3V3", "U13_5", -1, BASE_METHOD_AS_IS, -1, -1},
{ "TS", "TS", "U13_6", -1, BASE_METHOD_AS_IS, -1, -1},
{ "VCC-1V8", "VCC-1V8", "U13_7", -1, BASE_METHOD_AS_IS, -1, -1},
{ "BAT", "BAT", "U13_8", -1, BASE_METHOD_AS_IS, -1, -1},
{ "TWI1-SDA", "KPD-I2C-SDA", "U13_9", 48, BASE_METHOD_AS_IS, -1, -1},
{ "PWRON", "PWRON", "U13_10", -1, BASE_METHOD_AS_IS, -1, -1},
{ "TWI1-SCK", "KPD-I2C-SCL", "U13_11", 47, BASE_METHOD_AS_IS, -1, -1},
{ "GND", "GND", "U13_12", -1, BASE_METHOD_AS_IS, -1, -1},
{ "X1", "X1", "U13_13", -1, BASE_METHOD_AS_IS, -1, -1},
{ "X2", "X2", "U13_14", -1, BASE_METHOD_AS_IS, -1, -1},
{ "Y1", "Y1", "U13_15", -1, BASE_METHOD_AS_IS, -1, -1},
{ "Y2", "Y2", "U13_16", -1, BASE_METHOD_AS_IS, -1, -1},
{ "LCD-D2", "LCD-D2", "U13_17", 98, BASE_METHOD_AS_IS, -1, -1},
{ "PWM0", "PWM0", "U13_18", 34, BASE_METHOD_AS_IS, 0, -1},
{ "LCD-D4", "LCD-D4", "U13_19", 100, BASE_METHOD_AS_IS, -1, -1},
{ "LCD-D3", "LCD-D3", "U13_20", 99, BASE_METHOD_AS_IS, -1, -1},
{ "LCD-D6", "LCD-D6", "U13_21", 102, BASE_METHOD_AS_IS, -1, -1},
{ "LCD-D5", "LCD-D5", "U13_22", 101, BASE_METHOD_AS_IS, -1, -1},
{ "LCD-D10", "LCD-D10", "U13_23", 106, BASE_METHOD_AS_IS, -1, -1},
{ "LCD-D7", "LCD-D7", "U13_24", 103, BASE_METHOD_AS_IS, -1, -1},
{ "LCD-D12", "LCD-D12", "U13_25", 108, BASE_METHOD_AS_IS, -1, -1},
{ "LCD-D11", "LCD-D11", "U13_26", 107, BASE_METHOD_AS_IS, -1, -1},
{ "LCD-D14", "LCD-D14", "U13_27", 110, BASE_METHOD_AS_IS, -1, -1},
{ "LCD-D13", "LCD-D13", "U13_28", 109, BASE_METHOD_AS_IS, -1, -1},
{ "LCD-D18", "LCD-D18", "U13_29", 114, BASE_METHOD_AS_IS, -1, -1},
{ "LCD-D15", "LCD-D15", "U13_30", 111, BASE_METHOD_AS_IS, -1, -1},
{ "LCD-D20", "LCD-D20", "U13_31", 116, BASE_METHOD_AS_IS, -1, -1},
{ "LCD-D19", "LCD-D19", "U13_32", 115, BASE_METHOD_AS_IS, -1, -1},
{ "LCD-D22", "LCD-D22", "U13_33", 118, BASE_METHOD_AS_IS, -1, -1},
{ "LCD-D21", "LCD-D21", "U13_34", 117, BASE_METHOD_AS_IS, -1, -1},
{ "LCD-CLK", "LCD-CLK", "U13_35", 120, BASE_METHOD_AS_IS, -1, -1},
{ "LCD-D23", "LCD-D23", "U13_36", 119, BASE_METHOD_AS_IS, -1, -1},
{ "LCD-VSYNC", "LCD-VSYNC", "U13_37", 123, BASE_METHOD_AS_IS, -1, -1},
{ "LCD-HSYNC", "LCD-HSYNC", "U13_38", 122, BASE_METHOD_AS_IS, -1, -1},
{ "GND", "GND", "U13_39", -1, BASE_METHOD_AS_IS, -1, -1},
{ "LCD-DE", "LCD-DE", "U13_40", 121, BASE_METHOD_AS_IS, -1, -1},
{ "GND", "GND", "U14_1", -1, BASE_METHOD_AS_IS, -1, -1},
{ "VCC-5V", "VCC-5V", "U14_2", -1, BASE_METHOD_AS_IS, -1, -1},
{ "UART1-TX", "UART-TX", "U14_3", 195, BASE_METHOD_AS_IS, -1, -1},
{ "HPL", "HPL", "U14_4", -1, BASE_METHOD_AS_IS, -1, -1},
{ "UART1-RX", "UART-RX", "U14_5", 196, BASE_METHOD_AS_IS, -1, -1},
{ "HPCOM", "HPCOM", "U14_6", -1, BASE_METHOD_AS_IS, -1, -1},
{ "FEL", "FEL", "U14_7", -1, BASE_METHOD_AS_IS, -1, -1},
{ "HPR", "HPR", "U14_8", -1, BASE_METHOD_AS_IS, -1, -1},
{ "VCC-3V3", "VCC-3V3", "U14_9", -1, BASE_METHOD_AS_IS, -1, -1},
{ "MICM", "MICM", "U14_10", -1, BASE_METHOD_AS_IS, -1, -1},
{ "LRADC", "ADC", "U14_11", -1, BASE_METHOD_AS_IS, -1, 0},
{ "MICIN1", "MICIN1", "U14_12", -1, BASE_METHOD_AS_IS, -1, -1},
{ "XIO-P0", "XIO-P0", "U14_13", 0, BASE_METHOD_XIO, -1, -1},
{ "XIO-P1", "XIO-P1", "U14_14", 1, BASE_METHOD_XIO, -1, -1},
{ "XIO-P2", "GPIO1", "U14_15", 2, BASE_METHOD_XIO, -1, -1},
{ "XIO-P3", "GPIO2", "U14_16", 3, BASE_METHOD_XIO, -1, -1},
{ "XIO-P4", "GPIO3", "U14_17", 4, BASE_METHOD_XIO, -1, -1},
{ "XIO-P5", "GPIO4", "U14_18", 5, BASE_METHOD_XIO, -1, -1},
{ "XIO-P6", "GPIO5", "U14_19", 6, BASE_METHOD_XIO, -1, -1},
{ "XIO-P7", "GPIO6", "U14_20", 7, BASE_METHOD_XIO, -1, -1},
{ "GND", "GND", "U14_21", -1, BASE_METHOD_AS_IS, -1, -1},
{ "GND", "GND", "U14_22", -1, BASE_METHOD_AS_IS, -1, -1},
{ "AP-EINT1", "KPD-INT", "U14_23", 193, BASE_METHOD_AS_IS, -1, -1},
{ "AP-EINT3", "AP-INT3", "U14_24", 35, BASE_METHOD_AS_IS, -1, -1},
{ "TWI2-SDA", "I2C-SDA", "U14_25", 50, BASE_METHOD_AS_IS, -1, -1},
{ "TWI2-SCK", "I2C-SCL", "U14_26", 49, BASE_METHOD_AS_IS, -1, -1},
{ "CSIPCK", "SPI-SEL", "U14_27", 128, BASE_METHOD_AS_IS, -1, -1},
{ "CSICK", "SPI-CLK", "U14_28", 129, BASE_METHOD_AS_IS, -1, -1},
{ "CSIHSYNC", "SPI-MOSI", "U14_29", 130, BASE_METHOD_AS_IS, 1, -1},
{ "CSIVSYNC", "SPI-MISO", "U14_30", 131, BASE_METHOD_AS_IS, -1, -1},
{ "CSID0", "CSID0", "U14_31", 132, BASE_METHOD_AS_IS, 1, -1},
{ "CSID1", "CSID1", "U14_32", 133, BASE_METHOD_AS_IS, -1, -1},
{ "CSID2", "CSID2", "U14_33", 134, BASE_METHOD_AS_IS, -1, -1},
{ "CSID3", "CSID3", "U14_34", 135, BASE_METHOD_AS_IS, -1, -1},
{ "CSID4", "CSID4", "U14_35", 136, BASE_METHOD_AS_IS, -1, -1},
{ "CSID5", "CSID5", "U14_36", 137, BASE_METHOD_AS_IS, -1, -1},
{ "CSID6", "CSID6", "U14_37", 138, BASE_METHOD_AS_IS, -1, -1},
{ "CSID7", "CSID7", "U14_38", 139, BASE_METHOD_AS_IS, -1, -1},
{ "GND", "GND", "U14_39", -1, BASE_METHOD_AS_IS, -1, -1},
{ "GND", "GND", "U14_40", -1, BASE_METHOD_AS_IS, -1, -1},
{ NULL, NULL, NULL, -1, 0, -1, -1}
{ "GND", "GND", "U13_1", -1, BASE_METHOD_AS_IS, -1, -1, SPWM_DISABLED},
{ "CHG-IN", "CHG-IN", "U13_2", -1, BASE_METHOD_AS_IS, -1, -1, SPWM_DISABLED},
{ "VCC-5V", "VCC-5V", "U13_3", -1, BASE_METHOD_AS_IS, -1, -1, SPWM_DISABLED},
{ "GND", "GND", "U13_4", -1, BASE_METHOD_AS_IS, -1, -1, SPWM_DISABLED},
{ "VCC-3V3", "VCC-3V3", "U13_5", -1, BASE_METHOD_AS_IS, -1, -1, SPWM_DISABLED},
{ "TS", "TS", "U13_6", -1, BASE_METHOD_AS_IS, -1, -1, SPWM_DISABLED},
{ "VCC-1V8", "VCC-1V8", "U13_7", -1, BASE_METHOD_AS_IS, -1, -1, SPWM_DISABLED},
{ "BAT", "BAT", "U13_8", -1, BASE_METHOD_AS_IS, -1, -1, SPWM_DISABLED},
{ "TWI1-SDA", "KPD-I2C-SDA", "U13_9", 48, BASE_METHOD_AS_IS, -1, -1, SPWM_DISABLED},
{ "PWRON", "PWRON", "U13_10", -1, BASE_METHOD_AS_IS, -1, -1, SPWM_DISABLED},
{ "TWI1-SCK", "KPD-I2C-SCL", "U13_11", 47, BASE_METHOD_AS_IS, -1, -1, SPWM_DISABLED},
{ "GND", "GND", "U13_12", -1, BASE_METHOD_AS_IS, -1, -1, SPWM_DISABLED},
{ "X1", "X1", "U13_13", -1, BASE_METHOD_AS_IS, -1, -1, SPWM_DISABLED},
{ "X2", "X2", "U13_14", -1, BASE_METHOD_AS_IS, -1, -1, SPWM_DISABLED},
{ "Y1", "Y1", "U13_15", -1, BASE_METHOD_AS_IS, -1, -1, SPWM_DISABLED},
{ "Y2", "Y2", "U13_16", -1, BASE_METHOD_AS_IS, -1, -1, SPWM_DISABLED},
{ "LCD-D2", "LCD-D2", "U13_17", 98, BASE_METHOD_AS_IS, -1, -1, SPWM_DISABLED},
{ "PWM0", "PWM0", "U13_18", 34, BASE_METHOD_AS_IS, 0, -1, SPWM_DISABLED},
{ "LCD-D4", "LCD-D4", "U13_19", 100, BASE_METHOD_AS_IS, -1, -1, SPWM_DISABLED},
{ "LCD-D3", "LCD-D3", "U13_20", 99, BASE_METHOD_AS_IS, -1, -1, SPWM_DISABLED},
{ "LCD-D6", "LCD-D6", "U13_21", 102, BASE_METHOD_AS_IS, -1, -1, SPWM_DISABLED},
{ "LCD-D5", "LCD-D5", "U13_22", 101, BASE_METHOD_AS_IS, -1, -1, SPWM_DISABLED},
{ "LCD-D10", "LCD-D10", "U13_23", 106, BASE_METHOD_AS_IS, -1, -1, SPWM_DISABLED},
{ "LCD-D7", "LCD-D7", "U13_24", 103, BASE_METHOD_AS_IS, -1, -1, SPWM_DISABLED},
{ "LCD-D12", "LCD-D12", "U13_25", 108, BASE_METHOD_AS_IS, -1, -1, SPWM_DISABLED},
{ "LCD-D11", "LCD-D11", "U13_26", 107, BASE_METHOD_AS_IS, -1, -1, SPWM_DISABLED},
{ "LCD-D14", "LCD-D14", "U13_27", 110, BASE_METHOD_AS_IS, -1, -1, SPWM_DISABLED},
{ "LCD-D13", "LCD-D13", "U13_28", 109, BASE_METHOD_AS_IS, -1, -1, SPWM_DISABLED},
{ "LCD-D18", "LCD-D18", "U13_29", 114, BASE_METHOD_AS_IS, -1, -1, SPWM_DISABLED},
{ "LCD-D15", "LCD-D15", "U13_30", 111, BASE_METHOD_AS_IS, -1, -1, SPWM_DISABLED},
{ "LCD-D20", "LCD-D20", "U13_31", 116, BASE_METHOD_AS_IS, -1, -1, SPWM_DISABLED},
{ "LCD-D19", "LCD-D19", "U13_32", 115, BASE_METHOD_AS_IS, -1, -1, SPWM_DISABLED},
{ "LCD-D22", "LCD-D22", "U13_33", 118, BASE_METHOD_AS_IS, -1, -1, SPWM_DISABLED},
{ "LCD-D21", "LCD-D21", "U13_34", 117, BASE_METHOD_AS_IS, -1, -1, SPWM_DISABLED},
{ "LCD-CLK", "LCD-CLK", "U13_35", 120, BASE_METHOD_AS_IS, -1, -1, SPWM_DISABLED},
{ "LCD-D23", "LCD-D23", "U13_36", 119, BASE_METHOD_AS_IS, -1, -1, SPWM_DISABLED},
{ "LCD-VSYNC", "LCD-VSYNC", "U13_37", 123, BASE_METHOD_AS_IS, -1, -1, SPWM_DISABLED},
{ "LCD-HSYNC", "LCD-HSYNC", "U13_38", 122, BASE_METHOD_AS_IS, -1, -1, SPWM_DISABLED},
{ "GND", "GND", "U13_39", -1, BASE_METHOD_AS_IS, -1, -1, SPWM_DISABLED},
{ "LCD-DE", "LCD-DE", "U13_40", 121, BASE_METHOD_AS_IS, -1, -1, SPWM_DISABLED},
{ "GND", "GND", "U14_1", -1, BASE_METHOD_AS_IS, -1, -1, SPWM_DISABLED},
{ "VCC-5V", "VCC-5V", "U14_2", -1, BASE_METHOD_AS_IS, -1, -1, SPWM_DISABLED},
{ "UART1-TX", "UART-TX", "U14_3", 195, BASE_METHOD_AS_IS, -1, -1, SPWM_DISABLED},
{ "HPL", "HPL", "U14_4", -1, BASE_METHOD_AS_IS, -1, -1, SPWM_DISABLED},
{ "UART1-RX", "UART-RX", "U14_5", 196, BASE_METHOD_AS_IS, -1, -1, SPWM_DISABLED},
{ "HPCOM", "HPCOM", "U14_6", -1, BASE_METHOD_AS_IS, -1, -1, SPWM_DISABLED},
{ "FEL", "FEL", "U14_7", -1, BASE_METHOD_AS_IS, -1, -1, SPWM_DISABLED},
{ "HPR", "HPR", "U14_8", -1, BASE_METHOD_AS_IS, -1, -1, SPWM_DISABLED},
{ "VCC-3V3", "VCC-3V3", "U14_9", -1, BASE_METHOD_AS_IS, -1, -1, SPWM_DISABLED},
{ "MICM", "MICM", "U14_10", -1, BASE_METHOD_AS_IS, -1, -1, SPWM_DISABLED},
{ "LRADC", "ADC", "U14_11", -1, BASE_METHOD_AS_IS, -1, 0, SPWM_DISABLED},
{ "MICIN1", "MICIN1", "U14_12", -1, BASE_METHOD_AS_IS, -1, -1, SPWM_DISABLED},
{ "XIO-P0", "XIO-P0", "U14_13", 0, BASE_METHOD_XIO, -1, -1, SPWM_ENABLED},
{ "XIO-P1", "XIO-P1", "U14_14", 1, BASE_METHOD_XIO, -1, -1, SPWM_ENABLED},
{ "XIO-P2", "GPIO1", "U14_15", 2, BASE_METHOD_XIO, -1, -1, SPWM_ENABLED},
{ "XIO-P3", "GPIO2", "U14_16", 3, BASE_METHOD_XIO, -1, -1, SPWM_ENABLED},
{ "XIO-P4", "GPIO3", "U14_17", 4, BASE_METHOD_XIO, -1, -1, SPWM_ENABLED},
{ "XIO-P5", "GPIO4", "U14_18", 5, BASE_METHOD_XIO, -1, -1, SPWM_ENABLED},
{ "XIO-P6", "GPIO5", "U14_19", 6, BASE_METHOD_XIO, -1, -1, SPWM_ENABLED},
{ "XIO-P7", "GPIO6", "U14_20", 7, BASE_METHOD_XIO, -1, -1, SPWM_ENABLED},
{ "GND", "GND", "U14_21", -1, BASE_METHOD_AS_IS, -1, -1, SPWM_DISABLED},
{ "GND", "GND", "U14_22", -1, BASE_METHOD_AS_IS, -1, -1, SPWM_DISABLED},
{ "AP-EINT1", "KPD-INT", "U14_23", 193, BASE_METHOD_AS_IS, -1, -1, SPWM_DISABLED},
{ "AP-EINT3", "AP-INT3", "U14_24", 35, BASE_METHOD_AS_IS, -1, -1, SPWM_DISABLED},
{ "TWI2-SDA", "I2C-SDA", "U14_25", 50, BASE_METHOD_AS_IS, -1, -1, SPWM_DISABLED},
{ "TWI2-SCK", "I2C-SCL", "U14_26", 49, BASE_METHOD_AS_IS, -1, -1, SPWM_DISABLED},
{ "CSIPCK", "SPI-SEL", "U14_27", 128, BASE_METHOD_AS_IS, -1, -1, SPWM_DISABLED},
{ "CSICK", "SPI-CLK", "U14_28", 129, BASE_METHOD_AS_IS, -1, -1, SPWM_DISABLED},
{ "CSIHSYNC", "SPI-MOSI", "U14_29", 130, BASE_METHOD_AS_IS, 1, -1, SPWM_DISABLED},
{ "CSIVSYNC", "SPI-MISO", "U14_30", 131, BASE_METHOD_AS_IS, -1, -1, SPWM_DISABLED},
{ "CSID0", "CSID0", "U14_31", 132, BASE_METHOD_AS_IS, 1, -1, SPWM_DISABLED},
{ "CSID1", "CSID1", "U14_32", 133, BASE_METHOD_AS_IS, -1, -1, SPWM_DISABLED},
{ "CSID2", "CSID2", "U14_33", 134, BASE_METHOD_AS_IS, -1, -1, SPWM_DISABLED},
{ "CSID3", "CSID3", "U14_34", 135, BASE_METHOD_AS_IS, -1, -1, SPWM_DISABLED},
{ "CSID4", "CSID4", "U14_35", 136, BASE_METHOD_AS_IS, -1, -1, SPWM_DISABLED},
{ "CSID5", "CSID5", "U14_36", 137, BASE_METHOD_AS_IS, -1, -1, SPWM_DISABLED},
{ "CSID6", "CSID6", "U14_37", 138, BASE_METHOD_AS_IS, -1, -1, SPWM_DISABLED},
{ "CSID7", "CSID7", "U14_38", 139, BASE_METHOD_AS_IS, -1, -1, SPWM_DISABLED},
{ "GND", "GND", "U14_39", -1, BASE_METHOD_AS_IS, -1, -1, SPWM_DISABLED},
{ "GND", "GND", "U14_40", -1, BASE_METHOD_AS_IS, -1, -1, SPWM_DISABLED},
{ NULL, NULL, NULL, -1, 0, -1, -1, -1}
};

View File

@ -54,11 +54,15 @@ SOFTWARE.
#define MODE_UNKNOWN -1
#define BOARD 10
#define BCM 11
#define CHIP 0
#define CHIPPRO 1
// In the pins_t structure, the "base_method" field tells how
// the "gpio" field should be interpreted.
#define BASE_METHOD_AS_IS 1 /* use the gpio value directly */
#define BASE_METHOD_XIO 2 /* add the gpio value to the XIO base */
#define SPWM_ENABLED 1 /* pin able to be used by software pwm */
#define SPWM_DISABLED 0 /* pin unable to be used by software pwm */
typedef struct pins_t {
const char *name;
@ -66,8 +70,9 @@ typedef struct pins_t {
const char *key;
int gpio; /* port number to use under /sys/class/gpio */
int base_method; /* modifier for port number; see BASE_METHOD_... */
int pwm_mux_mode;
int ain;
int pwm_mux_mode; /* pwm pin */
int ain; /* analog pin */
int spwm_allow; /* pin allowed for software pwm */
} pins_t;

View File

@ -76,6 +76,15 @@ void define_constants(PyObject *module)
both_edge = Py_BuildValue("i", BOTH_EDGE);
PyModule_AddObject(module, "BOTH", both_edge);
version = Py_BuildValue("s", "0.2.5");
unknown = Py_BuildValue("i", MODE_UNKNOWN);
PyModule_AddObject(module, "UNKNOWN", unknown);
board = Py_BuildValue("i", BOARD);
PyModule_AddObject(module, "BOARD", board);
bcm = Py_BuildValue("i", BCM);
PyModule_AddObject(module, "BCM", bcm);
version = Py_BuildValue("s", "0.3.0");
PyModule_AddObject(module, "VERSION", version);
}

View File

@ -10,5 +10,8 @@ PyObject *rising_edge;
PyObject *falling_edge;
PyObject *both_edge;
PyObject *version;
PyObject *unknown;
PyObject *board;
PyObject *bcm;
void define_constants(PyObject *module);

View File

@ -215,7 +215,9 @@ int open_value_file(int gpio)
// create file descriptor of value file
snprintf(filename, sizeof(filename), "/sys/class/gpio/gpio%d/value", gpio); BUF2SMALL(filename);
if ((fd = open(filename, O_RDONLY | O_NONBLOCK)) < 0) {
// Changed this to open Read/Write to prevent a ton of file open/closes from happening when using
// the GPIO for SOFTPWM
if ((fd = open(filename, O_RDWR | O_NONBLOCK)) < 0) {
char err[256];
snprintf(err, sizeof(err), "open_value_file: could not open '%s' (%s)", filename, strerror(errno));
add_error_msg(err);
@ -376,17 +378,23 @@ int gpio_get_direction(int gpio, unsigned int *value)
int gpio_set_value(int gpio, unsigned int value)
{
int fd, e_no;
// This now uses the value file descriptor that is set in the other struct
// in an effort to minimize opening/closing this
int fd = fd_lookup(gpio);
int e_no;
char filename[MAX_FILENAME];
char vstr[16];
snprintf(filename, sizeof(filename), "/sys/class/gpio/gpio%d/value", gpio); BUF2SMALL(filename);
if ((fd = open(filename, O_WRONLY)) < 0) {
char err[256];
snprintf(err, sizeof(err), "gpio_set_value: could not open '%s' (%s)", filename, strerror(errno));
add_error_msg(err);
return -1;
if (!fd)
{
if ((fd = open_value_file(gpio)) == -1) {
char err[256];
snprintf(err, sizeof(err), "gpio_get_value: could not open GPIO %d value file", gpio);
add_error_msg(err);
return -1;
}
}
if (value) {
@ -396,7 +404,6 @@ int gpio_set_value(int gpio, unsigned int value)
}
ssize_t s = write(fd, vstr, strlen(vstr)); e_no = errno;
close(fd);
if (s != strlen(vstr)) {
char err[256];

View File

@ -71,13 +71,36 @@ static void remember_gpio_direction(int gpio, int direction)
dyn_int_array_set(&gpio_direction, gpio, direction, -1);
}
// python function cleanup()
// Dummy function to mimic RPi.GPIO for easier porting.
// python function setmode(mode)
static PyObject *py_setmode(PyObject *self, PyObject *args)
{
Py_RETURN_NONE;
}
// python function cleanup(channel=None)
static PyObject *py_cleanup(PyObject *self, PyObject *args)
{
int gpio;
char *channel;
clear_error_msg();
// clean up any exports
event_cleanup();
// Channel is optional
if (!PyArg_ParseTuple(args, "|s", &channel))
return NULL;
if (strcmp(channel, "") == 0) {
event_cleanup();
} else {
if (get_gpio_number(channel, &gpio) < 0) {
char err[2000];
snprintf(err, sizeof(err), "Invalid channel %s. (%s)", channel, get_error_msg());
PyErr_SetString(PyExc_ValueError, err);
return NULL;
}
gpio_unexport(gpio);
}
Py_RETURN_NONE;
}
@ -749,9 +772,6 @@ static PyObject *py_selftest(PyObject *self, PyObject *args)
static const char moduledocstring[] = "GPIO functionality of a CHIP using Python";
/*
mine for changing pin directipn
*/
@ -811,7 +831,8 @@ PyMethodDef gpio_methods[] = {
{"setwarnings", py_setwarnings, METH_VARARGS, "Enable or disable warning messages"},
{"get_gpio_base", py_gpio_base, METH_VARARGS, "Get the XIO base number for sysfs"},
{"selftest", py_selftest, METH_VARARGS, "Internal unit tests"},
{ "direction", (PyCFunction)py_set_direction, METH_VARARGS, "Change direction of gpio channel. Either INPUT or OUTPUT\n" },
{"direction", (PyCFunction)py_set_direction, METH_VARARGS, "Change direction of gpio channel. Either INPUT or OUTPUT\n" },
{"setmode", (PyCFunction)py_setmode, METH_VARARGS, "Dummy function that does nothing but maintain compatibility with RPi.GPIO\n" },
{NULL, NULL, 0, NULL}
};

View File

@ -34,11 +34,26 @@ SOFTWARE.
#include "common.h"
#include "c_softpwm.h"
// python function cleanup()
// python function cleanup(channel=None)
static PyObject *py_cleanup(PyObject *self, PyObject *args)
{
// unexport the PWM
softpwm_cleanup();
char key[8];
char *channel = NULL;
// Channel is optional
if (!PyArg_ParseTuple(args, "|s", &channel))
return NULL;
if (strcmp(channel, "") == 0) {
softpwm_cleanup();
} else {
if (!get_key(channel, key)) {
PyErr_SetString(PyExc_ValueError, "Invalid SOFTPWM key or name.");
return NULL;
}
softpwm_disable(key);
}
Py_RETURN_NONE;
}
@ -171,15 +186,14 @@ static PyObject *py_set_frequency(PyObject *self, PyObject *args, PyObject *kwar
Py_RETURN_NONE;
}
static const char moduledocstring[] = "Software PWM functionality of a CHIP using Python";
PyMethodDef pwm_methods[] = {
{"start", (PyCFunction)py_start_channel, METH_VARARGS | METH_KEYWORDS, "Set up and start the PWM channel. channel can be in the form of 'XIO-P0', or 'U14_13'"},
{"stop", (PyCFunction)py_stop_channel, METH_VARARGS | METH_KEYWORDS, "Stop the PWM channel. channel can be in the form of 'XIO-P0', or 'U14_13'"},
{ "start", (PyCFunction)py_start_channel, METH_VARARGS | METH_KEYWORDS, "Set up and start the PWM channel. channel can be in the form of 'XIO-P0', or 'U14_13'"},
{ "stop", (PyCFunction)py_stop_channel, METH_VARARGS | METH_KEYWORDS, "Stop the PWM channel. channel can be in the form of 'XIO-P0', or 'U14_13'"},
{ "set_duty_cycle", (PyCFunction)py_set_duty_cycle, METH_VARARGS, "Change the duty cycle\ndutycycle - between 0.0 and 100.0" },
{ "set_frequency", (PyCFunction)py_set_frequency, METH_VARARGS, "Change the frequency\nfrequency - frequency in Hz (freq > 0.0)" },
{"cleanup", py_cleanup, METH_VARARGS, "Clean up by resetting all GPIO channels that have been used by this program to INPUT with no pullup/pulldown and no event detection"},
{ "cleanup", (PyCFunction)py_cleanup, METH_VARARGS, "Clean up by resetting all GPIO channels that have been used by this program to INPUT with no pullup/pulldown and no event detection"},
//{"setwarnings", py_setwarnings, METH_VARARGS, "Enable or disable warning messages"},
{NULL, NULL, 0, NULL}
};