88#include <stdio.h>
99#include <string.h>
1010
11- #ifdef ESP_PLATFORM
11+ #if ESP_PLATFORM
1212#include "freertos/FreeRTOS.h"
1313#include "freertos/task.h"
14+ #include "driver/spi_master.h"
1415#include "esp_log.h"
1516#else
1617#define ESP_LOGI (tag , fmt , ...) printf(fmt, __VA_ARGS__)
1718#endif
1819
20+ #ifdef CONFIG_IDF_TARGET_ESP32
21+ #define PIN_NUM_MISO 19
22+ #define PIN_NUM_MOSI 23
23+ #define PIN_NUM_CLK 18
24+ #define PIN_NUM_CS 5
25+ #endif
26+
1927#define TAG ("mruby-esp32-spi")
2028
2129typedef struct spi_t {
@@ -24,6 +32,9 @@ typedef struct spi_t {
2432 mrb_int mode ;
2533 mrb_int first_bit ;
2634 mrb_state * mrb ;
35+ #ifdef ESP_PLATFORM
36+ spi_device_handle_t * device_handle ;
37+ #endif
2738} spi_t ;
2839
2940static void mrb_spi_free (mrb_state * mrb , void * p );
@@ -32,6 +43,12 @@ static const struct mrb_data_type mrb_spi = {
3243 "mrb_mruby_esp32_spi" , mrb_spi_free
3344};
3445
46+ #if ESP_PLATFORM
47+ static void
48+ mrb_spi_pre_transfer_callback (spi_transaction_t * t ) {
49+ }
50+ #endif
51+
3552static void
3653mrb_spi_free (mrb_state * mrb , void * p ) {
3754 spi_t * spi = (spi_t * )p ;
@@ -51,6 +68,34 @@ mrb_spi_init(mrb_state *mrb, mrb_value self) {
5168 spi -> unit , spi -> mode , spi -> first_bit , spi -> frequency
5269 );
5370
71+ #ifdef ESP_PLATFORM
72+ esp_err_t ret ;
73+ spi_device_handle_t device_handle ;
74+ spi_bus_config_t bus_config = {
75+ .miso_io_num = PIN_NUM_MISO ,
76+ .mosi_io_num = PIN_NUM_MOSI ,
77+ .sclk_io_num = PIN_NUM_CLK ,
78+ .quadwp_io_num = -1 ,
79+ .quadhd_io_num = -1 ,
80+ .max_transfer_sz = 0
81+ };
82+ spi_device_interface_config_t device_config = {
83+ .clock_speed_hz = spi -> frequency ,
84+ .mode = spi -> mode ,
85+ .spics_io_num = PIN_NUM_CS ,
86+ .queue_size = 7 ,
87+ .pre_cb = mrb_spi_pre_transfer_callback ,
88+ };
89+
90+ ret = spi_bus_initialize (VSPI_HOST , & bus_config , SPI_DMA_CH_AUTO );
91+ ESP_ERROR_CHECK (ret );
92+
93+ ret = spi_bus_add_device (VSPI_HOST , & device_config , & device_handle );
94+ ESP_ERROR_CHECK (ret );
95+
96+ spi -> device_handle = device_handle ;
97+ #endif
98+
5499 mrb_data_init (self , spi , & mrb_spi );
55100
56101 return self ;
@@ -68,6 +113,9 @@ mrb_spi_setmode(mrb_state *mrb, mrb_value self) {
68113 spi -> unit , spi -> mode , spi -> first_bit , spi -> frequency
69114 );
70115
116+ #ifdef ESP_PLATFORM
117+ #endif
118+
71119 return self ;
72120}
73121
@@ -79,15 +127,31 @@ mrb_spi_read(mrb_state *mrb, mrb_value self) {
79127 mrb_get_args (mrb , "i" , & read_bytes );
80128 ESP_LOGI (TAG , "read(%d)" , read_bytes );
81129
130+ #ifdef ESP_PLATFORM
131+ #endif
132+
82133 return self ;
83134}
84135
85136static mrb_value
86137mrb_spi_write (mrb_state * mrb , mrb_value self ) {
87138 spi_t * spi = (spi_t * ) DATA_PTR (self );
88- mrb_value data ;
139+ char * data ;
140+ mrb_int len ;
141+
142+ mrb_get_args (mrb , "s" , & data , & len );
143+ ESP_LOGI (TAG , "write(%s)" , data );
89144
90- mrb_get_args (mrb , "S" , & data );
145+ #ifdef ESP_PLATFORM
146+ esp_err_t ret ;
147+ spi_transaction_t transaction = {
148+ .length = len * 8 ,
149+ .tx_buffer = data ,
150+ .user = (void * )0 ,
151+ };
152+ ret = spi_device_polling_transmit (spi -> device_handle , & transaction );
153+ assert (ret == ESP_OK );
154+ #endif
91155
92156 return self ;
93157}
0 commit comments