66
77RC522_LOG_DEFINE_BASE ();
88
9+ typedef struct
10+ {
11+ gpio_num_t cs_io_num ;
12+ } rc522_spi_meta_t ;
13+
914static void rc522_spi_transaction_pre_cb (spi_transaction_t * trans );
15+
1016static void rc522_spi_transaction_post_cb (spi_transaction_t * trans );
1117
18+ static esp_err_t rc522_spi_uninstall (const rc522_driver_handle_t driver );
19+
1220static esp_err_t rc522_spi_install (const rc522_driver_handle_t driver )
1321{
1422 RC522_CHECK (driver == NULL );
1523 RC522_CHECK (driver -> config == NULL );
1624
25+ esp_err_t ret = ESP_OK ;
26+
27+ rc522_spi_meta_t * meta = calloc (1 , sizeof (rc522_spi_meta_t ));
28+ ESP_GOTO_ON_FALSE (meta != NULL , ESP_ERR_NO_MEM , error , TAG , "nomem" );
29+ driver -> meta = (void * )meta ;
30+
1731 rc522_spi_config_t * conf = (rc522_spi_config_t * )(driver -> config );
1832
1933 if (conf -> bus_config ) {
2034 // overwrite bus config
21- conf -> bus_config -> quadwp_io_num = -1 ;
22- conf -> bus_config -> quadhd_io_num = -1 ;
35+ conf -> bus_config -> quadwp_io_num = GPIO_NUM_NC ;
36+ conf -> bus_config -> quadhd_io_num = GPIO_NUM_NC ;
2337
24- RC522_RETURN_ON_ERROR (spi_bus_initialize (conf -> host_id , conf -> bus_config , conf -> dma_chan ));
38+ ESP_GOTO_ON_ERROR (spi_bus_initialize (conf -> host_id , conf -> bus_config , conf -> dma_chan ),
39+ error ,
40+ TAG ,
41+ "spi bus initialization failed" );
2542 }
2643 else {
2744 RC522_LOGD ("skips spi bus initialization" );
@@ -50,32 +67,38 @@ static esp_err_t rc522_spi_install(const rc522_driver_handle_t driver)
5067 // ESP32 SPI bus has limitation of 3 CS lines, so we need to use
5168 // software control for CS line in order to use more devices.
5269 {
53- driver -> cs_io_num = conf -> dev_config .spics_io_num ;
54- conf -> dev_config .spics_io_num = -1 ;
70+ meta -> cs_io_num = conf -> dev_config .spics_io_num ;
71+ conf -> dev_config .spics_io_num = GPIO_NUM_NC ;
5572
5673 gpio_config_t cs_conf = {
5774 .intr_type = GPIO_INTR_DISABLE ,
5875 .mode = GPIO_MODE_OUTPUT ,
59- .pin_bit_mask = (1ULL << driver -> cs_io_num ),
76+ .pin_bit_mask = (1ULL << meta -> cs_io_num ),
6077 .pull_down_en = GPIO_PULLDOWN_DISABLE ,
6178 .pull_up_en = GPIO_PULLUP_DISABLE ,
6279 };
6380
64- RC522_RETURN_ON_ERROR (gpio_config (& cs_conf ));
65- RC522_RETURN_ON_ERROR (gpio_set_level (driver -> cs_io_num , 1 ));
81+ ESP_GOTO_ON_ERROR (gpio_config (& cs_conf ), error , TAG , "cs gpio config failed" );
82+ ESP_GOTO_ON_ERROR (gpio_set_level (meta -> cs_io_num , 1 ), error , TAG , "cs set level failed" );
6683
6784 conf -> dev_config .pre_cb = & rc522_spi_transaction_pre_cb ;
6885 conf -> dev_config .post_cb = & rc522_spi_transaction_post_cb ;
6986 }
7087
71- RC522_RETURN_ON_ERROR (
72- spi_bus_add_device (conf -> host_id , & conf -> dev_config , (spi_device_handle_t * )(& driver -> device )));
88+ ESP_GOTO_ON_ERROR (spi_bus_add_device (conf -> host_id , & conf -> dev_config , (spi_device_handle_t * )(& driver -> device )),
89+ error ,
90+ TAG ,
91+ "spi bus add device failed" );
7392
7493 if (conf -> rst_io_num > GPIO_NUM_NC ) {
75- RC522_RETURN_ON_ERROR (rc522_driver_init_rst_pin (conf -> rst_io_num ));
94+ ESP_GOTO_ON_ERROR (rc522_driver_init_rst_pin (conf -> rst_io_num ), error , TAG , "init rst pin failed" );
7695 }
7796
78- return ESP_OK ;
97+ goto exit ;
98+ error :
99+ RC522_LOG_ON_ERROR (rc522_spi_uninstall (driver ));
100+ exit :
101+ return ret ;
79102}
80103
81104static esp_err_t rc522_spi_send (const rc522_driver_handle_t driver , uint8_t address , const rc522_bytes_t * bytes )
@@ -143,16 +166,23 @@ static esp_err_t rc522_spi_reset(const rc522_driver_handle_t driver)
143166static esp_err_t rc522_spi_uninstall (const rc522_driver_handle_t driver )
144167{
145168 RC522_CHECK (driver == NULL );
146- RC522_CHECK (driver -> device == NULL );
147- RC522_CHECK (driver -> config == NULL );
148169
149- RC522_RETURN_ON_ERROR (spi_bus_remove_device ((spi_device_handle_t )(driver -> device )));
150- driver -> device = NULL ;
170+ if (driver -> meta ) {
171+ free (driver -> meta );
172+ driver -> meta = NULL ;
173+ }
151174
152- rc522_spi_config_t * conf = (rc522_spi_config_t * )(driver -> config );
175+ if (driver -> device ) {
176+ RC522_LOG_ON_ERROR (spi_bus_remove_device ((spi_device_handle_t )(driver -> device )));
177+ driver -> device = NULL ;
178+ }
153179
154- if (conf -> bus_config ) {
155- RC522_RETURN_ON_ERROR (spi_bus_free (conf -> host_id ));
180+ if (driver -> config ) {
181+ rc522_spi_config_t * conf = (rc522_spi_config_t * )(driver -> config );
182+
183+ if (conf -> bus_config ) {
184+ RC522_LOG_ON_ERROR (spi_bus_free (conf -> host_id ));
185+ }
156186 }
157187
158188 return ESP_OK ;
@@ -177,11 +207,13 @@ esp_err_t rc522_spi_create(const rc522_spi_config_t *config, rc522_driver_handle
177207static void rc522_spi_transaction_pre_cb (spi_transaction_t * trans )
178208{
179209 rc522_driver_handle_t driver = (rc522_driver_handle_t )trans -> user ;
180- RC522_LOG_ON_ERROR (gpio_set_level (driver -> cs_io_num , 0 ));
210+ rc522_spi_meta_t * meta = (rc522_spi_meta_t * )(driver -> meta );
211+ RC522_LOG_ON_ERROR (gpio_set_level (meta -> cs_io_num , 0 ));
181212}
182213
183214static void rc522_spi_transaction_post_cb (spi_transaction_t * trans )
184215{
185216 rc522_driver_handle_t driver = (rc522_driver_handle_t )trans -> user ;
186- RC522_LOG_ON_ERROR (gpio_set_level (driver -> cs_io_num , 1 ));
217+ rc522_spi_meta_t * meta = (rc522_spi_meta_t * )(driver -> meta );
218+ RC522_LOG_ON_ERROR (gpio_set_level (meta -> cs_io_num , 1 ));
187219}
0 commit comments