30 _IOC_TYPESHIFT = (_IOC_NRSHIFT+_IOC_NRBITS)
31 _IOC_SIZESHIFT = (_IOC_TYPESHIFT+_IOC_TYPEBITS)
32 _IOC_DIRSHIFT = (_IOC_SIZESHIFT+_IOC_SIZEBITS)
38 def _IOC(direction,t,nr,size):
39 return (((direction) << _IOC_DIRSHIFT) |
40 ((size) << _IOC_SIZESHIFT) |
41 ((t) << _IOC_TYPESHIFT) |
42 ((nr) << _IOC_NRSHIFT))
44 return _IOC(_IOC_READ, t, number, size)
46 return _IOC(_IOC_WRITE, t, number, size)
52 SPI_MODE_1 = (0|SPI_CPHA)
53 SPI_MODE_2 = (SPI_CPOL|0)
54 SPI_MODE_3 = (SPI_CPOL|SPI_CPHA)
64 SPI_IOC_MAGIC = ord(
'k')
67 return _IOW(SPI_IOC_MAGIC, 0, count)
70 SPI_IOC_RD_MODE =
_IOR(SPI_IOC_MAGIC, 1, 1)
71 SPI_IOC_WR_MODE =
_IOW(SPI_IOC_MAGIC, 1, 1)
79 SPI_IOC_RD_BITS_PER_WORD =
_IOR(SPI_IOC_MAGIC, 3, 1)
80 SPI_IOC_WR_BITS_PER_WORD =
_IOW(SPI_IOC_MAGIC, 3, 1)
83 SPI_IOC_RD_MAX_SPEED_HZ =
_IOR(SPI_IOC_MAGIC, 4, 4)
84 SPI_IOC_WR_MAX_SPEED_HZ =
_IOW(SPI_IOC_MAGIC, 4, 4)
87 def __init__(self, chip=0, mode=0, bits=8, speed=0):
88 Bus.__init__(self,
"SPI",
"/dev/spidev0.%d" % chip)
91 val8 = array.array(
'B', [0])
93 if fcntl.ioctl(self.
fd, SPI_IOC_WR_MODE, val8):
94 raise Exception(
"Cannot write SPI Mode")
95 if fcntl.ioctl(self.
fd, SPI_IOC_RD_MODE, val8):
96 raise Exception(
"Cannot read SPI Mode")
97 self.
mode = struct.unpack(
'B', val8)[0]
98 assert(self.
mode == mode)
101 if fcntl.ioctl(self.
fd, SPI_IOC_WR_BITS_PER_WORD, val8):
102 raise Exception(
"Cannot write SPI Bits per word")
103 if fcntl.ioctl(self.
fd, SPI_IOC_RD_BITS_PER_WORD, val8):
104 raise Exception(
"Cannot read SPI Bits per word")
105 self.
bits = struct.unpack(
'B', val8)[0]
106 assert(self.
bits == bits)
108 val32 = array.array(
'I', [0])
111 if fcntl.ioctl(self.
fd, SPI_IOC_WR_MAX_SPEED_HZ, val32):
112 raise Exception(
"Cannot write SPI Max speed")
113 if fcntl.ioctl(self.
fd, SPI_IOC_RD_MAX_SPEED_HZ, val32):
114 raise Exception(
"Cannot read SPI Max speed")
115 self.
speed = struct.unpack(
'I', val32)[0]
116 assert((self.
speed == speed)
or (speed == 0))
119 return "SPI(chip=%d, mode=%d, speed=%dHz)" % (self.
chip, self.
mode, self.
speed)
123 if PYTHON_MAJOR >= 3:
124 _txbuff = bytes(txbuff)
125 _txptr = ctypes.create_string_buffer(_txbuff)
127 _txbuff = str(bytearray(txbuff))
128 _txptr = ctypes.create_string_buffer(_txbuff)
129 _rxptr = ctypes.create_string_buffer(length)
131 data = struct.pack(
"QQLLHBBL",
132 ctypes.addressof(_txptr),
133 ctypes.addressof(_rxptr),
143 _rxbuff = ctypes.string_at(_rxptr, length)
144 return bytearray(_rxbuff)