# HG changeset patch # User Paul Boddie # Date 1699834809 -3600 # Node ID 438287f28c11c9a91eb86832b4a8cd87150c8b0d # Parent 34c65d2fb03e2359c8fe4f725f6ae6675e1dd599 Wrapped GPIO-driven SPI operations in the hybrid SPI abstraction, making the sending operations generic. diff -r 34c65d2fb03e -r 438287f28c11 pkg/landfall-examples/hw_info/common.h --- a/pkg/landfall-examples/hw_info/common.h Mon Nov 13 01:18:52 2023 +0100 +++ b/pkg/landfall-examples/hw_info/common.h Mon Nov 13 01:20:09 2023 +0100 @@ -182,7 +182,7 @@ void spi_release_control(void *channel); -void spi_send_gpio(void *channel, uint32_t bytes, const uint8_t data[]); +void spi_send(void *channel, uint32_t bytes, const uint8_t data[]); void spi_send_units(void *channel, uint32_t bytes, const uint8_t data[], uint8_t unit_size, uint8_t char_size); diff -r 34c65d2fb03e -r 438287f28c11 pkg/landfall-examples/hw_info/hw_info.c --- a/pkg/landfall-examples/hw_info/hw_info.c Mon Nov 13 01:18:52 2023 +0100 +++ b/pkg/landfall-examples/hw_info/hw_info.c Mon Nov 13 01:20:09 2023 +0100 @@ -1083,7 +1083,7 @@ spi_release_control(channel); } -static void spi_send_data_gpio(void) +static void spi_send_data(void) { void *channel = get_channel(num_spi_channels, spi_channels, NULL); int bytes; @@ -1098,7 +1098,7 @@ bytes++; } - spi_send_gpio(channel, bytes, buffer); + spi_send(channel, bytes, buffer); } static void spi_send_data_units(void) @@ -1287,7 +1287,7 @@ else if (!strcmp(token, "g") || !strcmp(token, "gpio") || !strcmp(token, "gpio-channel")) new_spi_channel_gpio(gpio); else if (!strcmp(token, "s") || !strcmp(token, "send")) - spi_send_data_gpio(); + spi_send_data(); else if (!strcmp(token, "S") || !strcmp(token, "send-units")) spi_send_data_units(); else if (!strcmp(token, "t") || !strcmp(token, "transfer")) diff -r 34c65d2fb03e -r 438287f28c11 pkg/landfall-examples/hw_info/jz4780.c --- a/pkg/landfall-examples/hw_info/jz4780.c Mon Nov 13 01:18:52 2023 +0100 +++ b/pkg/landfall-examples/hw_info/jz4780.c Mon Nov 13 01:20:09 2023 +0100 @@ -352,9 +352,11 @@ void *enable_chip, int enable_pin, void *control_chip, int control_pin) { - return spi_gpio_get_channel(frequency, clock_chip, clock_pin, data_chip, - data_pin, enable_chip, enable_pin, control_chip, - control_pin); + void *ch = spi_gpio_get_channel(frequency, clock_chip, clock_pin, data_chip, + data_pin, enable_chip, enable_pin, control_chip, + control_pin); + + return spi_hybrid_get_channel(ch, control_chip, control_pin, -1); } void spi_acquire_control(void *channel, int level) @@ -367,15 +369,15 @@ spi_hybrid_release_control(channel); } -void spi_send_gpio(void *channel, uint32_t bytes, const uint8_t data[]) +void spi_send(void *channel, uint32_t bytes, const uint8_t data[]) { - spi_gpio_send(channel, bytes, data); + spi_hybrid_send(channel, bytes, data); } void spi_send_units(void *channel, uint32_t bytes, const uint8_t data[], uint8_t unit_size, uint8_t char_size) { - jz4780_spi_send_units(channel, bytes, data, unit_size, char_size); + spi_hybrid_send_units(channel, bytes, data, unit_size, char_size); } uint32_t spi_transfer(void *channel, l4re_dma_space_dma_addr_t paddr, diff -r 34c65d2fb03e -r 438287f28c11 pkg/landfall-examples/hw_info/x1600.c --- a/pkg/landfall-examples/hw_info/x1600.c Mon Nov 13 01:18:52 2023 +0100 +++ b/pkg/landfall-examples/hw_info/x1600.c Mon Nov 13 01:20:09 2023 +0100 @@ -25,7 +25,8 @@ #include #include #include -// #include +#include +#include #include "common.h" @@ -326,18 +327,15 @@ void *spi_init(l4_addr_t spi_start, l4_addr_t start, l4_addr_t end, void *cpm) { - (void) spi_start; (void) start; (void) end; (void) cpm; - return NULL; + return jz4780_spi_init(spi_start, start, end, cpm); } void *spi_get_channel(void *spi, uint8_t num, void *channel, uint64_t frequency, void *control_chip, int control_pin, int control_alt_func) { - /* NOTE: Initialisation of a hybrid channel to be supported. */ + void *ch = jz4780_spi_get_channel(spi, num, channel, frequency); - (void) spi; (void) num; (void) channel; (void) frequency; - (void) control_chip; (void) control_pin; (void) control_alt_func; - return NULL; + return spi_hybrid_get_channel(ch, control_chip, control_pin, control_alt_func); } void *spi_get_channel_gpio(uint64_t frequency, @@ -346,52 +344,44 @@ void *enable_chip, int enable_pin, void *control_chip, int control_pin) { - return spi_gpio_get_channel(frequency, clock_chip, clock_pin, data_chip, - data_pin, enable_chip, enable_pin, control_chip, - control_pin); + void *ch = spi_gpio_get_channel(frequency, clock_chip, clock_pin, data_chip, + data_pin, enable_chip, enable_pin, control_chip, + control_pin); + + return spi_hybrid_get_channel(ch, control_chip, control_pin, -1); } void spi_acquire_control(void *channel, int level) { - /* NOTE: Not yet supported. */ - - (void) channel; (void) level; - // spi_hybrid_acquire_control(channel, level); + spi_hybrid_acquire_control(channel, level); } void spi_release_control(void *channel) { - /* NOTE: Not yet supported. */ - - (void) channel; - // spi_hybrid_release_control(channel); + spi_hybrid_release_control(channel); } -void spi_send_gpio(void *channel, uint32_t bytes, const uint8_t data[]) +void spi_send(void *channel, uint32_t bytes, const uint8_t data[]) { - spi_gpio_send(channel, bytes, data); + spi_hybrid_send(channel, bytes, data); } void spi_send_units(void *channel, uint32_t bytes, const uint8_t data[], uint8_t unit_size, uint8_t char_size) { - /* NOTE: Not yet supported. */ - - (void) channel; (void) bytes; (void) data; (void) unit_size; (void) char_size; - // x1600_spi_send_units(channel, bytes, data, unit_size, char_size); + spi_hybrid_send_units(channel, bytes, data, unit_size, char_size); } uint32_t spi_transfer(void *channel, l4re_dma_space_dma_addr_t paddr, uint32_t count, uint8_t unit_size, uint8_t char_size, l4_addr_t desc_vaddr, l4re_dma_space_dma_addr_t desc_paddr) { - /* NOTE: Not yet supported. */ + /* Transfer is not supported by the common interface. */ - (void) channel; (void) paddr; (void) count; (void) unit_size; (void) char_size; - (void) desc_vaddr; (void) desc_paddr; - // return x1600_spi_transfer(channel, paddr, count, unit_size, char_size, - // desc_vaddr, desc_paddr); - return 0; + void *ch = spi_hybrid_get_raw_channel(channel); + + return jz4780_spi_transfer_descriptor(ch, paddr, count, unit_size, char_size, + desc_vaddr, desc_paddr); }