1
+ // This file is part of the CircuitPython project: https://circuitpython.org
2
+ //
3
+ // SPDX-FileCopyrightText: Copyright (c) 2021 Scott Shawcroft for Adafruit Industries
4
+ //
5
+ // SPDX-License-Identifier: MIT
6
+
7
+ #include "shared-bindings/busio/WIZNET_PIO_SPI.h"
8
+
9
+ #include "shared/runtime/interrupt_char.h"
10
+ #include "py/mperrno.h"
11
+ #include "py/runtime.h"
12
+
13
+ #include "supervisor/board.h"
14
+ #include "common-hal/microcontroller/Pin.h"
15
+ #include "shared-bindings/microcontroller/Pin.h"
16
+
17
+ #include "hardware/dma.h"
18
+ #include "hardware/gpio.h"
19
+ #include "hardware/pio.h"
20
+ #include "hardware/clocks.h"
21
+
22
+ #include "wiznet_pio_spi/wizchip_pio_spi.h"
23
+
24
+ #define NO_INSTANCE 0xff
25
+
26
+ #ifndef PIO_SPI_PREFERRED_PIO
27
+ #define PIO_SPI_PREFERRED_PIO 1
28
+ #endif
29
+
30
+ // All wiznet spi operations must start with writing a 3 byte header
31
+
32
+ wiznet_pio_spi_config_t wiznet_pio_spi_config ;
33
+ wiznet_pio_spi_handle_t wiznet_pio_spi_handle = NULL ;
34
+
35
+ void common_hal_wiznet_pio_spi_construct (wiznet_pio_spi_obj_t * self ,
36
+ const mcu_pin_obj_t * clock , const mcu_pin_obj_t * mosi ,
37
+ const mcu_pin_obj_t * miso , bool half_duplex ) {
38
+
39
+ if (half_duplex ) {
40
+ mp_raise_NotImplementedError_varg (MP_ERROR_TEXT ("%q" ), MP_QSTR_half_duplex );
41
+ }
42
+
43
+ wiznet_pio_spi_config .data_in_pin = miso -> number ;
44
+ wiznet_pio_spi_config .data_out_pin = mosi -> number ;
45
+ wiznet_pio_spi_config .clock_pin = clock -> number ;
46
+
47
+ if (wiznet_pio_spi_handle != NULL ) {
48
+ wiznet_pio_spi_close (wiznet_pio_spi_handle );
49
+ }
50
+
51
+ wiznet_pio_spi_handle = wiznet_pio_spi_open (& wiznet_pio_spi_config );
52
+ (* wiznet_pio_spi_handle )-> set_active (wiznet_pio_spi_handle );
53
+
54
+ }
55
+
56
+ bool common_hal_wiznet_pio_spi_deinited (wiznet_pio_spi_obj_t * self ) {
57
+ return wiznet_pio_spi_config .clock_pin == 0 ;
58
+ }
59
+
60
+ void common_hal_wiznet_pio_spi_deinit (wiznet_pio_spi_obj_t * self ) {
61
+ if (common_hal_wiznet_pio_spi_deinited (self )) {
62
+ return ;
63
+ }
64
+
65
+ common_hal_reset_pin (self -> clock );
66
+ common_hal_reset_pin (self -> MOSI );
67
+ common_hal_reset_pin (self -> MISO );
68
+
69
+ wiznet_pio_spi_config .clock_pin = 0 ;
70
+ }
71
+
72
+ bool common_hal_wiznet_pio_spi_configure (wiznet_pio_spi_obj_t * self ,
73
+ uint32_t baudrate , uint8_t polarity , uint8_t phase , uint8_t bits ) {
74
+
75
+ uint32_t clock = clock_get_hz (clk_sys );
76
+ uint32_t clock_div = clock / baudrate ;
77
+
78
+ if (clock_div > clock / 4 ) {
79
+ clock_div = clock / 4 ;
80
+ }
81
+
82
+ wiznet_pio_spi_config .clock_div_major = clock_div ;
83
+ wiznet_pio_spi_config .clock_div_minor = 0 ;
84
+
85
+ return true;
86
+ }
87
+
88
+ bool common_hal_wiznet_pio_spi_try_lock (wiznet_pio_spi_obj_t * self ) {
89
+ if (common_hal_wiznet_pio_spi_deinited (self )) {
90
+ return false;
91
+ }
92
+
93
+ bool grabbed_lock = false;
94
+ if (!self -> has_lock ) {
95
+ grabbed_lock = true;
96
+ self -> has_lock = true;
97
+ }
98
+ return grabbed_lock ;
99
+ }
100
+
101
+ bool common_hal_wiznet_pio_spi_has_lock (wiznet_pio_spi_obj_t * self ) {
102
+ return self -> has_lock ;
103
+ }
104
+
105
+ void common_hal_wiznet_pio_spi_unlock (wiznet_pio_spi_obj_t * self ) {
106
+ self -> has_lock = false;
107
+ }
108
+
109
+ bool common_hal_wiznet_pio_spi_write (wiznet_pio_spi_obj_t * self ,
110
+ const uint8_t * data , size_t len ) {
111
+ wiznet_pio_spi_write_buffer (data , len );
112
+ return true;
113
+ }
114
+
115
+ bool common_hal_wiznet_pio_spi_read (wiznet_pio_spi_obj_t * self ,
116
+ uint8_t * data , size_t len , uint8_t write_value ) {
117
+ wiznet_pio_spi_read_buffer (data , len );
118
+ return true;
119
+ }
120
+
121
+ bool common_hal_wiznet_pio_spi_transfer (wiznet_pio_spi_obj_t * self , const uint8_t * data_out , uint8_t * data_in , size_t len ) {
122
+ return wiznet_pio_spi_transfer (data_out , len , data_in , len );
123
+ }
0 commit comments