|
33 | 33 | #include <sys/ioctl.h> |
34 | 34 | #include "common.h" |
35 | 35 |
|
| 36 | +#if PY_MAJOR_VERSION < 3 |
| 37 | +# define PyLong_AS_LONG(val) PyInt_AS_LONG(val) |
| 38 | +# define PyLong_AsLong(val) PyInt_AsLong(val) |
| 39 | +# define PyLong_Check(val) PyInt_Check(val) |
| 40 | +#endif |
| 41 | + |
36 | 42 | PyDoc_STRVAR(SPI_module_doc, |
37 | 43 | "This module defines an object type that allows SPI transactions\n" |
38 | 44 | "on hosts running the Linux kernel. The host kernel must have SPI\n" |
@@ -94,7 +100,7 @@ SPI_dealloc(SPI *self) |
94 | 100 | PyObject *ref = SPI_close(self); |
95 | 101 | Py_XDECREF(ref); |
96 | 102 |
|
97 | | - self->ob_type->tp_free((PyObject *)self); |
| 103 | + Py_TYPE(self)->tp_free((PyObject *)self); |
98 | 104 | } |
99 | 105 |
|
100 | 106 | #define MAXPATH 16 |
@@ -131,11 +137,11 @@ SPI_writebytes(SPI *self, PyObject *args) |
131 | 137 |
|
132 | 138 | for (ii = 0; ii < len; ii++) { |
133 | 139 | PyObject *val = PyList_GET_ITEM(list, ii); |
134 | | - if (!PyInt_Check(val)) { |
| 140 | + if (!PyLong_Check(val)) { |
135 | 141 | PyErr_SetString(PyExc_TypeError, wrmsg); |
136 | 142 | return NULL; |
137 | 143 | } |
138 | | - buf[ii] = (__u8)PyInt_AS_LONG(val); |
| 144 | + buf[ii] = (__u8)PyLong_AS_LONG(val); |
139 | 145 | } |
140 | 146 |
|
141 | 147 | status = write(self->fd, &buf[0], len); |
@@ -237,14 +243,14 @@ SPI_xfer(SPI *self, PyObject *args) |
237 | 243 |
|
238 | 244 | for (ii = 0; ii < len; ii++) { |
239 | 245 | PyObject *val = PyList_GET_ITEM(list, ii); |
240 | | - if (!PyInt_Check(val)) { |
| 246 | + if (!PyLong_Check(val)) { |
241 | 247 | free(txbuf); |
242 | 248 | free(rxbuf); |
243 | 249 | free(xferptr); |
244 | 250 | PyErr_SetString(PyExc_TypeError, wrmsg); |
245 | 251 | return NULL; |
246 | 252 | } |
247 | | - txbuf[ii] = (__u8)PyInt_AS_LONG(val); |
| 253 | + txbuf[ii] = (__u8)PyLong_AS_LONG(val); |
248 | 254 | xferptr[ii].tx_buf = (unsigned long)&txbuf[ii]; |
249 | 255 | xferptr[ii].rx_buf = (unsigned long)&rxbuf[ii]; |
250 | 256 | xferptr[ii].len = 1; |
@@ -315,13 +321,13 @@ SPI_xfer2(SPI *self, PyObject *args) |
315 | 321 |
|
316 | 322 | for (ii = 0; ii < len; ii++) { |
317 | 323 | PyObject *val = PyList_GET_ITEM(list, ii); |
318 | | - if (!PyInt_Check(val)) { |
| 324 | + if (!PyLong_Check(val)) { |
319 | 325 | free(txbuf); |
320 | 326 | free(rxbuf); |
321 | 327 | PyErr_SetString(PyExc_TypeError, msg); |
322 | 328 | return NULL; |
323 | 329 | } |
324 | | - txbuf[ii] = (__u8)PyInt_AS_LONG(val); |
| 330 | + txbuf[ii] = (__u8)PyLong_AS_LONG(val); |
325 | 331 | } |
326 | 332 |
|
327 | 333 | xfer.tx_buf = (unsigned long)txbuf; |
@@ -447,13 +453,13 @@ SPI_set_mode(SPI *self, PyObject *val, void *closure) |
447 | 453 | "Cannot delete attribute"); |
448 | 454 | return -1; |
449 | 455 | } |
450 | | - else if (!PyInt_Check(val)) { |
| 456 | + else if (!PyLong_Check(val)) { |
451 | 457 | PyErr_SetString(PyExc_TypeError, |
452 | 458 | "The mode attribute must be an integer"); |
453 | 459 | return -1; |
454 | 460 | } |
455 | 461 |
|
456 | | - mode = PyInt_AsLong(val); |
| 462 | + mode = PyLong_AsLong(val); |
457 | 463 |
|
458 | 464 | if ( mode > 3 ) { |
459 | 465 | PyErr_SetString(PyExc_TypeError, |
@@ -601,13 +607,13 @@ SPI_set_bpw(SPI *self, PyObject *val, void *closure) |
601 | 607 | "Cannot delete attribute"); |
602 | 608 | return -1; |
603 | 609 | } |
604 | | - else if (!PyInt_Check(val)) { |
| 610 | + else if (!PyLong_Check(val)) { |
605 | 611 | PyErr_SetString(PyExc_TypeError, |
606 | 612 | "The bpw attribute must be an integer"); |
607 | 613 | return -1; |
608 | 614 | } |
609 | 615 |
|
610 | | - bits = PyInt_AsLong(val); |
| 616 | + bits = PyLong_AsLong(val); |
611 | 617 |
|
612 | 618 | if (bits < 8 || bits > 16) { |
613 | 619 | PyErr_SetString(PyExc_TypeError, |
@@ -642,13 +648,13 @@ SPI_set_msh(SPI *self, PyObject *val, void *closure) |
642 | 648 | "Cannot delete attribute"); |
643 | 649 | return -1; |
644 | 650 | } |
645 | | - else if (!PyInt_Check(val)) { |
| 651 | + else if (!PyLong_Check(val)) { |
646 | 652 | PyErr_SetString(PyExc_TypeError, |
647 | 653 | "The msh attribute must be an integer"); |
648 | 654 | return -1; |
649 | 655 | } |
650 | 656 |
|
651 | | - msh = PyInt_AsLong(val); |
| 657 | + msh = PyLong_AsLong(val); |
652 | 658 | // DAW - 8/12/12 - removed limitation on SPI speed |
653 | 659 | // if (8000000 < msh) { |
654 | 660 | // PyErr_SetString(PyExc_TypeError, |
@@ -793,8 +799,7 @@ static PyMethodDef SPI_methods[] = { |
793 | 799 | }; |
794 | 800 |
|
795 | 801 | static PyTypeObject SPI_type = { |
796 | | - PyObject_HEAD_INIT(NULL) |
797 | | - 0, /* ob_size */ |
| 802 | + PyVarObject_HEAD_INIT(NULL, 0) |
798 | 803 | "SPI", /* tp_name */ |
799 | 804 | sizeof(SPI), /* tp_basicsize */ |
800 | 805 | 0, /* tp_itemsize */ |
@@ -838,20 +843,47 @@ static PyMethodDef SPI_module_methods[] = { |
838 | 843 | {NULL} |
839 | 844 | }; |
840 | 845 |
|
| 846 | +#if PY_MAJOR_VERSION >= 3 |
| 847 | +static struct PyModuleDef moduledef = { |
| 848 | + PyModuleDef_HEAD_INIT, |
| 849 | + "SPI", /* m_name */ |
| 850 | + SPI_module_doc, /* m_doc */ |
| 851 | + -1, /* m_size */ |
| 852 | + SPI_module_methods, /* m_methods */ |
| 853 | + NULL, /* m_reload */ |
| 854 | + NULL, /* m_traverse */ |
| 855 | + NULL, /* m_clear */ |
| 856 | + NULL, /* m_free */ |
| 857 | +}; |
| 858 | +#endif |
| 859 | + |
841 | 860 | #ifndef PyMODINIT_FUNC /* declarations for DLL import/export */ |
842 | 861 | #define PyMODINIT_FUNC void |
843 | 862 | #endif |
844 | 863 | PyMODINIT_FUNC |
| 864 | +#if PY_MAJOR_VERSION >= 3 |
| 865 | +PyInit_SPI(void) |
| 866 | +#else |
845 | 867 | initSPI(void) |
| 868 | +#endif |
846 | 869 | { |
847 | 870 | PyObject* m; |
848 | 871 |
|
849 | 872 | if (PyType_Ready(&SPI_type) < 0) |
850 | 873 | return; |
851 | 874 |
|
| 875 | +#if PY_MAJOR_VERSION >= 3 |
| 876 | + m = PyModule_Create(&moduledef); |
| 877 | +#else |
852 | 878 | m = Py_InitModule3("SPI", SPI_module_methods, SPI_module_doc); |
| 879 | +#endif |
| 880 | + |
853 | 881 | Py_INCREF(&SPI_type); |
854 | 882 | PyModule_AddObject(m, "SPI", (PyObject *)&SPI_type); |
| 883 | + |
| 884 | +#if PY_MAJOR_VERSION >= 3 |
| 885 | + return m; |
| 886 | +#endif |
855 | 887 | } |
856 | 888 |
|
857 | 889 |
|
0 commit comments