1.1 --- a/pkg/devices/spi/src/jz4740/spi-jz4740.cc Sat Oct 14 22:02:07 2023 +0200
1.2 +++ b/pkg/devices/spi/src/jz4740/spi-jz4740.cc Sun Oct 15 22:24:25 2023 +0200
1.3 @@ -20,6 +20,7 @@
1.4 */
1.5
1.6 #include <l4/devices/gpio-jz4740.h>
1.7 +#include <l4/devices/spi-gpio.h>
1.8 #include <l4/devices/memory.h>
1.9
1.10 #include <l4/re/env.h>
1.11 @@ -54,20 +55,13 @@
1.12
1.13 class SPI_server : public SPI
1.14 {
1.15 - Gpio_jz4740_chip *_clock_device = 0, *_data_device = 0, *_enable_device = 0;
1.16 - int _clock_pin, _data_pin, _enable_pin;
1.17 + Spi_gpio *_spi;
1.18
1.19 public:
1.20 /* Associate the device with a particular memory region. */
1.21
1.22 - explicit SPI_server(Gpio_jz4740_chip *clock_device,
1.23 - Gpio_jz4740_chip *data_device,
1.24 - Gpio_jz4740_chip *enable_device,
1.25 - int clock_pin, int data_pin, int enable_pin)
1.26 - : _clock_device(clock_device),
1.27 - _data_device(data_device),
1.28 - _enable_device(enable_device),
1.29 - _clock_pin(clock_pin), _data_pin(data_pin), _enable_pin(enable_pin)
1.30 + explicit SPI_server(Spi_gpio *spi)
1.31 + : _spi(spi)
1.32 {
1.33 }
1.34
1.35 @@ -75,31 +69,15 @@
1.36
1.37 long send(int bits, int data)
1.38 {
1.39 - uint32_t mask = 1 << (bits - 1);
1.40 - int bit;
1.41 -
1.42 - /* Initialise pin levels. */
1.43 + int bytes = (bits + 7) / 8;
1.44 + uint8_t buffer[bytes];
1.45
1.46 - _enable_device->set(_enable_pin, 1);
1.47 - _clock_device->set(_clock_pin, 1);
1.48 - _data_device->set(_data_pin, 0);
1.49 -
1.50 - /* Enter the transmission state. */
1.51 + /* Convert the data into a sequence of bytes. */
1.52
1.53 - _enable_device->set(_enable_pin, 0);
1.54 -
1.55 - /* Clock data using the clock and data outputs. */
1.56 -
1.57 - for (bit = 0; bit < bits; bit++)
1.58 - {
1.59 - _clock_device->set(_clock_pin, 0);
1.60 - _data_device->set(_data_pin, data & mask ? 1 : 0);
1.61 - _clock_device->set(_clock_pin, 1);
1.62 - mask >>= 1;
1.63 - }
1.64 + for (int byte = bytes; byte > 0; byte--)
1.65 + buffer[byte - 1] = (data >> ((byte - 1) * 8)) & 0xff;
1.66
1.67 - _enable_device->set(_enable_pin, 1);
1.68 -
1.69 + _spi->send(bytes, buffer);
1.70 return L4_EOK;
1.71 }
1.72 };
1.73 @@ -182,10 +160,14 @@
1.74
1.75 gpio_port_enable.setup(enable_pin, Hw::Gpio_chip::Output, 0);
1.76
1.77 + /* Create an object for SPI communication. */
1.78 +
1.79 + Spi_gpio spi(&gpio_port_clock, clock_pin, &gpio_port_data, data_pin,
1.80 + &gpio_port_enable, enable_pin);
1.81 +
1.82 /* Initialise and register a new server object. */
1.83
1.84 - SPI_server obj(&gpio_port_clock, &gpio_port_data, &gpio_port_enable,
1.85 - clock_pin, data_pin, enable_pin);
1.86 + SPI_server obj(&spi);
1.87
1.88 /* Bind and start the IPC server loop. */
1.89