Skip to content

Commit 0d0d27f

Browse files
Extend bus types and structure for Peripheral Manager (espressif#8888)
* Extended bus types for peripheral manager * add extra_type to peripheral manager * Fix function call * Fix check for no extra_type * Add extra_type for SD and ETH CS pin * added bus_num and bus_channel to pin structure * update printPerimanInfo with new fields * replaced setting bus to INIT with DetachPin call * add defines for extra attributes * use new required parameters in perimanSetPinBus * function rename * removed duplicate define * Update print format --------- Co-authored-by: Rodrigo Garcia <rodrigo.garcia@espressif.com>
1 parent 600f359 commit 0d0d27f

22 files changed

+404
-217
lines changed

Diff for: cores/esp32/Arduino.h

+1
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@
3939

4040
#include "stdlib_noniso.h"
4141
#include "binary.h"
42+
#include "extra_attr.h"
4243

4344
#define PI 3.1415926535897932384626433832795
4445
#define HALF_PI 1.5707963267948966192313216916398

Diff for: cores/esp32/HWCDC.cpp

+5-5
Original file line numberDiff line numberDiff line change
@@ -181,8 +181,8 @@ bool HWCDC::deinit(void * busptr)
181181
running = true;
182182
// Setting USB D+ D- pins
183183
bool retCode = true;
184-
retCode &= perimanSetPinBus(USB_DM_GPIO_NUM, ESP32_BUS_TYPE_INIT, NULL);
185-
retCode &= perimanSetPinBus(USB_DP_GPIO_NUM, ESP32_BUS_TYPE_INIT, NULL);
184+
retCode &= perimanClearPinBus(USB_DM_GPIO_NUM);
185+
retCode &= perimanClearPinBus(USB_DP_GPIO_NUM);
186186
if (retCode) {
187187
// Force the host to re-enumerate (BUS_RESET)
188188
pinMode(USB_DM_GPIO_NUM, OUTPUT_OPEN_DRAIN);
@@ -220,10 +220,10 @@ void HWCDC::begin(unsigned long baud)
220220
end();
221221
return;
222222
}
223-
if (perimanSetBusDeinit(ESP32_BUS_TYPE_USB, HWCDC::deinit)) {
223+
if (perimanSetBusDeinit(ESP32_BUS_TYPE_USB_DM, HWCDC::deinit) && perimanSetBusDeinit(ESP32_BUS_TYPE_USB_DP, HWCDC::deinit)) {
224224
// Setting USB D+ D- pins
225-
perimanSetPinBus(USB_DM_GPIO_NUM, ESP32_BUS_TYPE_USB, (void *) this);
226-
perimanSetPinBus(USB_DP_GPIO_NUM, ESP32_BUS_TYPE_USB, (void *) this);
225+
perimanSetPinBus(USB_DM_GPIO_NUM, ESP32_BUS_TYPE_USB_DM, (void *) this, -1, -1);
226+
perimanSetPinBus(USB_DP_GPIO_NUM, ESP32_BUS_TYPE_USB_DP, (void *) this, -1, -1);
227227
} else {
228228
log_e("Serial JTAG Pins can't be set into Peripheral Manager.");
229229
}

Diff for: cores/esp32/chip-debug-report.cpp

+19-2
Original file line numberDiff line numberDiff line change
@@ -242,6 +242,8 @@ static void printBoardInfo(void){
242242
static void printPerimanInfo(void){
243243
chip_report_printf("GPIO Info:\n");
244244
chip_report_printf("------------------------------------------\n");
245+
chip_report_printf(" GPIO : BUS_TYPE[bus/unit][chan]\n");
246+
chip_report_printf(" -------------------------------------- \n");
245247
for(uint8_t i = 0; i < SOC_GPIO_PIN_COUNT; i++){
246248
if(!perimanPinIsValid(i)){
247249
continue;//invalid pin
@@ -250,8 +252,23 @@ static void printPerimanInfo(void){
250252
if(type == ESP32_BUS_TYPE_INIT){
251253
continue;//unused pin
252254
}
253-
chip_report_printf(" %17u : ", i);
254-
chip_report_printf("%s\n", perimanGetTypeName(type));
255+
const char* extra_type = perimanGetPinBusExtraType(i);
256+
chip_report_printf(" %4u : ", i);
257+
if(extra_type){
258+
chip_report_printf("%s", extra_type);
259+
}
260+
else {
261+
chip_report_printf("%s", perimanGetTypeName(type));
262+
}
263+
int8_t bus_number = perimanGetPinBusNum(i);
264+
if (bus_number != -1){
265+
chip_report_printf("[%u]", bus_number);
266+
}
267+
int8_t bus_channel = perimanGetPinBusChannel(i);
268+
if (bus_channel != -1){
269+
chip_report_printf("[%u]", bus_channel);
270+
}
271+
chip_report_printf("\n");
255272
}
256273
}
257274

Diff for: cores/esp32/esp32-hal-adc.c

+4-4
Original file line numberDiff line numberDiff line change
@@ -221,7 +221,7 @@ esp_err_t __analogInit(uint8_t pin, adc_channel_t channel, adc_unit_t adc_unit){
221221
}
222222
}
223223

224-
if(!perimanSetPinBus(pin, ESP32_BUS_TYPE_ADC_ONESHOT, (void *)(pin+1))){
224+
if(!perimanSetPinBus(pin, ESP32_BUS_TYPE_ADC_ONESHOT, (void *)(pin+1), adc_unit, channel)){
225225
adcDetachBus((void *)(pin+1));
226226
return err;
227227
}
@@ -396,7 +396,7 @@ static bool adcContinuousDetachBus(void * adc_unit_number){
396396
int io_pin;
397397
adc_oneshot_channel_to_io(adc_unit, channel, &io_pin);
398398
if(perimanGetPinBusType(io_pin) == ESP32_BUS_TYPE_ADC_CONT){
399-
if(!perimanSetPinBus(io_pin, ESP32_BUS_TYPE_INIT, NULL)){
399+
if(!perimanClearPinBus(io_pin)){
400400
return false;
401401
}
402402
}
@@ -497,7 +497,7 @@ bool analogContinuous(uint8_t pins[], size_t pins_count, uint32_t conversions_pe
497497
//Set periman deinit function and reset all pins to init state.
498498
perimanSetBusDeinit(ESP32_BUS_TYPE_ADC_CONT, adcContinuousDetachBus);
499499
for(int j = 0; j < pins_count; j++){
500-
if(!perimanSetPinBus(pins[j], ESP32_BUS_TYPE_INIT, NULL)){
500+
if(!perimanClearPinBus(pins[j])){
501501
return false;
502502
}
503503
}
@@ -571,7 +571,7 @@ bool analogContinuous(uint8_t pins[], size_t pins_count, uint32_t conversions_pe
571571
}
572572

573573
for(int k = 0; k < pins_count; k++){
574-
if(!perimanSetPinBus(pins[k], ESP32_BUS_TYPE_ADC_CONT, (void *)(adc_unit+1))){
574+
if(!perimanSetPinBus(pins[k], ESP32_BUS_TYPE_ADC_CONT, (void *)(adc_unit+1), adc_unit, channel[k])){
575575
log_e("perimanSetPinBus to ADC Continuous failed!");
576576
adcContinuousDetachBus((void *)(adc_unit+1));
577577
return false;

Diff for: cores/esp32/esp32-hal-dac.c

+3-3
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ bool __dacWrite(uint8_t pin, uint8_t value)
3232
dac_oneshot_handle_t bus = (dac_oneshot_handle_t)perimanGetPinBus(pin, ESP32_BUS_TYPE_DAC_ONESHOT);
3333
if(bus == NULL){
3434
perimanSetBusDeinit(ESP32_BUS_TYPE_DAC_ONESHOT, dacDetachBus);
35-
if(!perimanSetPinBus(pin, ESP32_BUS_TYPE_INIT, NULL)){
35+
if(!perimanClearPinBus(pin)){
3636
return false;
3737
}
3838
dac_channel_t channel = (pin == DAC_CHAN0_GPIO_NUM)?DAC_CHAN_0:DAC_CHAN_1;
@@ -44,7 +44,7 @@ bool __dacWrite(uint8_t pin, uint8_t value)
4444
log_e("dac_oneshot_new_channel failed with error: %d", err);
4545
return false;
4646
}
47-
if(!perimanSetPinBus(pin, ESP32_BUS_TYPE_DAC_ONESHOT, (void *)bus)){
47+
if(!perimanSetPinBus(pin, ESP32_BUS_TYPE_DAC_ONESHOT, (void *)bus, -1, channel)){
4848
dacDetachBus((void *)bus);
4949
return false;
5050
}
@@ -67,7 +67,7 @@ bool __dacDisable(uint8_t pin)
6767
void * bus = perimanGetPinBus(pin, ESP32_BUS_TYPE_DAC_ONESHOT);
6868
if(bus != NULL){
6969
// will call dacDetachBus
70-
return perimanSetPinBus(pin, ESP32_BUS_TYPE_INIT, NULL);
70+
return perimanClearPinBus(pin);
7171
} else {
7272
log_e("pin %u is not attached to DAC", pin);
7373
}

Diff for: cores/esp32/esp32-hal-gpio.c

+2-2
Original file line numberDiff line numberDiff line change
@@ -110,7 +110,7 @@ extern void ARDUINO_ISR_ATTR __pinMode(uint8_t pin, uint8_t mode)
110110

111111
if(perimanGetPinBus(pin, ESP32_BUS_TYPE_GPIO) == NULL){
112112
perimanSetBusDeinit(ESP32_BUS_TYPE_GPIO, gpioDetachBus);
113-
if(!perimanSetPinBus(pin, ESP32_BUS_TYPE_INIT, NULL)){
113+
if(!perimanClearPinBus(pin)){
114114
log_e("Deinit of previous bus failed");
115115
return;
116116
}
@@ -144,7 +144,7 @@ extern void ARDUINO_ISR_ATTR __pinMode(uint8_t pin, uint8_t mode)
144144
return;
145145
}
146146
if(perimanGetPinBus(pin, ESP32_BUS_TYPE_GPIO) == NULL){
147-
if(!perimanSetPinBus(pin, ESP32_BUS_TYPE_GPIO, (void *)(pin+1))){
147+
if(!perimanSetPinBus(pin, ESP32_BUS_TYPE_GPIO, (void *)(pin+1), -1, -1)){
148148
//gpioDetachBus((void *)(pin+1));
149149
return;
150150
}

Diff for: cores/esp32/esp32-hal-i2c-slave.c

+7-5
Original file line numberDiff line numberDiff line change
@@ -235,8 +235,10 @@ esp_err_t i2cSlaveInit(uint8_t num, int sda, int scl, uint16_t slaveID, uint32_t
235235
frequency = 1000000;
236236
}
237237

238-
perimanSetBusDeinit(ESP32_BUS_TYPE_I2C_SLAVE, i2cSlaveDetachBus);
239-
if(!perimanSetPinBus(sda, ESP32_BUS_TYPE_INIT, NULL) || !perimanSetPinBus(scl, ESP32_BUS_TYPE_INIT, NULL)){
238+
perimanSetBusDeinit(ESP32_BUS_TYPE_I2C_SLAVE_SDA, i2cSlaveDetachBus);
239+
perimanSetBusDeinit(ESP32_BUS_TYPE_I2C_SLAVE_SCL, i2cSlaveDetachBus);
240+
241+
if(!perimanClearPinBus(sda) || !perimanClearPinBus(scl)){
240242
return false;
241243
}
242244

@@ -353,7 +355,7 @@ esp_err_t i2cSlaveInit(uint8_t num, int sda, int scl, uint16_t slaveID, uint32_t
353355
i2c_ll_slave_enable_rx_it(i2c->dev);
354356
i2c_ll_set_stretch(i2c->dev, 0x3FF);
355357
i2c_ll_update(i2c->dev);
356-
if(!perimanSetPinBus(sda, ESP32_BUS_TYPE_I2C_SLAVE, (void *)(i2c->num+1)) || !perimanSetPinBus(scl, ESP32_BUS_TYPE_I2C_SLAVE, (void *)(i2c->num+1))){
358+
if(!perimanSetPinBus(sda, ESP32_BUS_TYPE_I2C_SLAVE_SDA, (void *)(i2c->num+1), i2c->num, -1) || !perimanSetPinBus(scl, ESP32_BUS_TYPE_I2C_SLAVE_SCL, (void *)(i2c->num+1), i2c->num, -1)){
357359
i2cSlaveDetachBus((void *)(i2c->num+1));
358360
ret = ESP_FAIL;
359361
}
@@ -383,8 +385,8 @@ esp_err_t i2cSlaveDeinit(uint8_t num){
383385
int scl = i2c->scl;
384386
int sda = i2c->sda;
385387
i2c_slave_free_resources(i2c);
386-
perimanSetPinBus(scl, ESP32_BUS_TYPE_INIT, NULL);
387-
perimanSetPinBus(sda, ESP32_BUS_TYPE_INIT, NULL);
388+
perimanClearPinBus(scl);
389+
perimanClearPinBus(sda);
388390
I2C_SLAVE_MUTEX_UNLOCK();
389391
return ESP_OK;
390392
}

Diff for: cores/esp32/esp32-hal-i2c.c

+7-5
Original file line numberDiff line numberDiff line change
@@ -98,8 +98,10 @@ esp_err_t i2cInit(uint8_t i2c_num, int8_t sda, int8_t scl, uint32_t frequency){
9898
frequency = 1000000UL;
9999
}
100100

101-
perimanSetBusDeinit(ESP32_BUS_TYPE_I2C_MASTER, i2cDetachBus);
102-
if(!perimanSetPinBus(sda, ESP32_BUS_TYPE_INIT, NULL) || !perimanSetPinBus(scl, ESP32_BUS_TYPE_INIT, NULL)){
101+
perimanSetBusDeinit(ESP32_BUS_TYPE_I2C_MASTER_SDA, i2cDetachBus);
102+
perimanSetBusDeinit(ESP32_BUS_TYPE_I2C_MASTER_SCL, i2cDetachBus);
103+
104+
if(!perimanClearPinBus(sda) || !perimanClearPinBus(scl)){
103105
return false;
104106
}
105107

@@ -128,7 +130,7 @@ esp_err_t i2cInit(uint8_t i2c_num, int8_t sda, int8_t scl, uint32_t frequency){
128130
bus[i2c_num].sda = sda;
129131
//Clock Stretching Timeout: 20b:esp32, 5b:esp32-c3, 24b:esp32-s2
130132
i2c_set_timeout((i2c_port_t)i2c_num, I2C_LL_MAX_TIMEOUT);
131-
if(!perimanSetPinBus(sda, ESP32_BUS_TYPE_I2C_MASTER, (void *)(i2c_num+1)) || !perimanSetPinBus(scl, ESP32_BUS_TYPE_I2C_MASTER, (void *)(i2c_num+1))){
133+
if(!perimanSetPinBus(sda, ESP32_BUS_TYPE_I2C_MASTER_SDA, (void *)(i2c_num+1), i2c_num, -1) || !perimanSetPinBus(scl, ESP32_BUS_TYPE_I2C_MASTER_SCL, (void *)(i2c_num+1), i2c_num, -1)){
132134
i2cDetachBus((void *)(i2c_num+1));
133135
return false;
134136
}
@@ -159,8 +161,8 @@ esp_err_t i2cDeinit(uint8_t i2c_num){
159161
err = i2c_driver_delete((i2c_port_t)i2c_num);
160162
if(err == ESP_OK){
161163
bus[i2c_num].initialized = false;
162-
perimanSetPinBus(bus[i2c_num].scl, ESP32_BUS_TYPE_INIT, NULL);
163-
perimanSetPinBus(bus[i2c_num].sda, ESP32_BUS_TYPE_INIT, NULL);
164+
perimanClearPinBus(bus[i2c_num].scl);
165+
perimanClearPinBus(bus[i2c_num].sda);
164166
bus[i2c_num].scl = -1;
165167
bus[i2c_num].sda = -1;
166168
}

Diff for: cores/esp32/esp32-hal-ledc.c

+4-4
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,7 @@ bool ledcAttach(uint8_t pin, uint32_t freq, uint8_t resolution)
6767

6868
perimanSetBusDeinit(ESP32_BUS_TYPE_LEDC, ledcDetachBus);
6969
ledc_channel_handle_t *bus = (ledc_channel_handle_t*)perimanGetPinBus(pin, ESP32_BUS_TYPE_LEDC);
70-
if(bus != NULL && !perimanSetPinBus(pin, ESP32_BUS_TYPE_INIT, NULL)){
70+
if(bus != NULL && !perimanClearPinBus(pin)){
7171
return false;
7272
}
7373

@@ -110,7 +110,7 @@ bool ledcAttach(uint8_t pin, uint32_t freq, uint8_t resolution)
110110
#endif
111111
ledc_handle.used_channels |= 1UL << channel;
112112

113-
if(!perimanSetPinBus(pin, ESP32_BUS_TYPE_LEDC, (void *)handle)){
113+
if(!perimanSetPinBus(pin, ESP32_BUS_TYPE_LEDC, (void *)handle, group, channel)){
114114
ledcDetachBus((void *)handle);
115115
return false;
116116
}
@@ -216,7 +216,7 @@ bool ledcDetach(uint8_t pin)
216216
ledc_channel_handle_t *bus = (ledc_channel_handle_t*)perimanGetPinBus(pin, ESP32_BUS_TYPE_LEDC);
217217
if(bus != NULL){
218218
// will call ledcDetachBus
219-
return perimanSetPinBus(pin, ESP32_BUS_TYPE_INIT, NULL);
219+
return perimanClearPinBus(pin);
220220
} else {
221221
log_e("pin %u is not attached to LEDC", pin);
222222
}
@@ -360,7 +360,7 @@ void analogWrite(uint8_t pin, int value) {
360360
// Use ledc hardware for internal pins
361361
if (pin < SOC_GPIO_PIN_COUNT) {
362362
ledc_channel_handle_t *bus = (ledc_channel_handle_t*)perimanGetPinBus(pin, ESP32_BUS_TYPE_LEDC);
363-
if(bus == NULL && perimanSetPinBus(pin, ESP32_BUS_TYPE_INIT, NULL)){
363+
if(bus == NULL && perimanClearPinBus(pin)){
364364
if(ledcAttach(pin, analog_frequency, analog_resolution) == 0){
365365
log_e("analogWrite setup failed (freq = %u, resolution = %u). Try setting different resolution or frequency");
366366
return;

0 commit comments

Comments
 (0)