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