From 5a83d0268b5dd37fe2f32f4466fa6539532929d9 Mon Sep 17 00:00:00 2001
From: NonPIayerCharacter
<18557343+NonPIayerCharacter@users.noreply.github.com>
Date: Mon, 20 Oct 2025 23:52:22 +0300
Subject: [PATCH] tr6260 quick pwm fix (#1838)
* tr6260 fix pwm
* forgot gpio14
* tr6260 interrupts
---
docs/platforms.md | 2 +-
src/hal/tr6260/hal_pins_tr6260.c | 197 ++++++++++++++++++++++++-------
2 files changed, 155 insertions(+), 44 deletions(-)
diff --git a/docs/platforms.md b/docs/platforms.md
index 0ac27d13b..923faf8bd 100644
--- a/docs/platforms.md
+++ b/docs/platforms.md
@@ -16,7 +16,7 @@
| LN882H | Lightning Semi | ✅ | ✅⁴ | ✅ | ✅ | ❌ | ✅ | ❗️ | ❌ | ✅ | ✅ | ✅ |
| ESP8266
ESP8285 | Espressif | ⚠️¹³ | ✅²'⁴ | ✅ | ✅ | ✅ | ✅⁷ | ❌ | ❗️ | ❓⁹ | ❌ | ❌ |
| ESP32
-C2
-C3
-C5
-C6
-C61
-S2
-S3 | Espressif | ⚠️¹³ | ✅⁴ | ✅ | ✅ | ✅ | ✅ | ❓ | ✅¹⁰ | ✅ | ✅ | ❌ |
-| TR6260 | Transa Semi | ❌ | ❗️³'⁴ | ✅ | ❌ | ❌ | ✅⁸ | ❌ | ❌ | ✅⁹ | ❌ | ❌ |
+| TR6260 | Transa Semi | ❌ | ❗️³'⁴ | ✅ | ✅ | ❌ | ✅⁸ | ❌ | ❌ | ✅⁹ | ❌ | ❌ |
| RTL8711AM (Ameba1) | Realtek | ❗️ | ✅⁴ | ✅ | ✅ | ✅ | ✅⁸ | ❌ | ❌ | ✅ | ✅ | ❌ |
| RTL8710B (AmebaZ) | Realtek | ✅ | ✅⁴ | ✅ | ✅ | ✅ | ✅⁸ | ❌ | ❌ | ✅ | ✅ | ❌ |
| RTL8710C
RTL8720C (AmebaZ2) | Realtek | ✅ | ✅⁴ | ✅ | ✅ | ✅ | ✅⁸ | ➖ | ❌ | ✅ | ✅ | ✅ |
diff --git a/src/hal/tr6260/hal_pins_tr6260.c b/src/hal/tr6260/hal_pins_tr6260.c
index 20fd32c49..c64c5fb3a 100644
--- a/src/hal/tr6260/hal_pins_tr6260.c
+++ b/src/hal/tr6260/hal_pins_tr6260.c
@@ -17,35 +17,35 @@ typedef struct trPinMapping_s
} trPinMapping_t;
trPinMapping_t g_pins[] = {
- { "GPIO0", DRV_GPIO_0 },
- { "GPIO1", DRV_GPIO_1 },
- { "GPIO2", DRV_GPIO_2 },
- { "GPIO3", DRV_GPIO_3 },
- { "GPIO4", DRV_GPIO_4 },
- { "GPIO5 (RX0)", DRV_GPIO_5 },
- { "GPIO6 (TX0)", DRV_GPIO_6 },
- { "GPIO7", DRV_GPIO_7 },
- { "GPIO8", DRV_GPIO_8 },
- { "GPIO9", DRV_GPIO_9 },
- { "GPIO10", DRV_GPIO_10 },
- { "GPIO11", DRV_GPIO_11 },
- { "GPIO12", DRV_GPIO_12 },
- { "GPIO13 (PWM5)", DRV_GPIO_13 },
- { "GPIO14", DRV_GPIO_14 },
- { "GPIO15", DRV_GPIO_15 },
- { "GPIO16", DRV_GPIO_16 },
- { "GPIO17", DRV_GPIO_17 },
- { "GPIO18", DRV_GPIO_18 },
- { "GPIO19", DRV_GPIO_19 },
- { "GPIO20 (PWM0)", DRV_GPIO_20 },
- { "GPIO21 (PWM1)", DRV_GPIO_21 },
- { "GPIO22 (PWM2)", DRV_GPIO_22 },
+ { "GPIO0 (PWM0)", DRV_GPIO_0 },
+ { "GPIO1 (PWM1)", DRV_GPIO_1 },
+ { "GPIO2 (PWM2)", DRV_GPIO_2 },
+ { "GPIO3 (PWM3)", DRV_GPIO_3 },
+ { "GPIO4 (PWM4)", DRV_GPIO_4 },
+ { "GPIO5 (RX0)", DRV_GPIO_5 },
+ { "GPIO6 (TX0)", DRV_GPIO_6 },
+ { "GPIO7", DRV_GPIO_7 },
+ { "GPIO8", DRV_GPIO_8 },
+ { "GPIO9", DRV_GPIO_9 },
+ { "GPIO10", DRV_GPIO_10 },
+ { "GPIO11", DRV_GPIO_11 },
+ { "GPIO12", DRV_GPIO_12 },
+ { "GPIO13 (PWM5)", DRV_GPIO_13 },
+ { "GPIO14 (PWM3)", DRV_GPIO_14 },
+ { "GPIO15 (PWM5)", DRV_GPIO_15 },
+ { "GPIO16", DRV_GPIO_16 },
+ { "GPIO17", DRV_GPIO_17 },
+ { "GPIO18", DRV_GPIO_18 },
+ { "GPIO19", DRV_GPIO_19 },
+ { "GPIO20 (PWM0)", DRV_GPIO_20 },
+ { "GPIO21 (PWM1)", DRV_GPIO_21 },
+ { "GPIO22 (PWM2)", DRV_GPIO_22 },
#if defined (_USR_TR6260)
- { "GPIO23 (PWM3)", DRV_GPIO_23 },
- { "GPIO24 (PWM4)", DRV_GPIO_24 },
+ { "GPIO23 (PWM3)", DRV_GPIO_23 },
+ { "GPIO24 (PWM4)", DRV_GPIO_24 },
#else
- { "GPIO23", DRV_GPIO_23 },
- { "GPIO24", DRV_GPIO_24 },
+ { "GPIO23", DRV_GPIO_23 },
+ { "GPIO24", DRV_GPIO_24 },
#endif
};
@@ -55,14 +55,17 @@ int PIN_GetPWMIndexForPinIndex(int pin)
{
switch(pin)
{
- case 13: return PMW_CHANNEL_5;
+ case 0:
case 20: return PMW_CHANNEL_0;
+ case 1:
case 21: return PMW_CHANNEL_1;
+ case 2:
case 22: return PMW_CHANNEL_2;
-#if defined (_USR_TR6260)
- case 23: return PMW_CHANNEL_3;
- case 24: return PMW_CHANNEL_4;
-#endif
+ case 3:
+ case 14: return PMW_CHANNEL_3;
+ case 4: return PMW_CHANNEL_4;
+ case 13:
+ case 15: return PMW_CHANNEL_5;
default: return -1;
}
}
@@ -254,7 +257,42 @@ void HAL_PIN_PWM_Stop(int index)
int ch = PIN_GetPWMIndexForPinIndex(index);
if(ch < 0) return;
pwm_stop(ch);
- pwm_deinit(ch);
+ switch(index)
+ {
+ case 0:
+ PIN_FUNC_SET(IO_MUX0_GPIO0, FUNC_GPIO0_GPIO0);
+ break;
+ case 20:
+ PIN_FUNC_SET(IO_MUX0_GPIO20, FUNC_GPIO20_GPIO20);
+ break;
+ case 1:
+ PIN_FUNC_SET(IO_MUX0_GPIO1, FUNC_GPIO1_GPIO1);
+ break;
+ case 21:
+ PIN_FUNC_SET(IO_MUX0_GPIO21, FUNC_GPIO21_GPIO21);
+ break;
+ case 2:
+ PIN_FUNC_SET(IO_MUX0_GPIO2, FUNC_GPIO2_GPIO2);
+ break;
+ case 22:
+ PIN_FUNC_SET(IO_MUX0_GPIO22, FUNC_GPIO22_GPIO22);
+ break;
+ case 3:
+ PIN_FUNC_SET(IO_MUX0_GPIO3, FUNC_GPIO3_GPIO3);
+ break;
+ case 14:
+ PIN_FUNC_SET(IO_MUX0_GPIO14, FUNC_GPIO14_GPIO14);
+ break;
+ case 4:
+ PIN_FUNC_SET(IO_MUX0_GPIO4, FUNC_GPIO4_GPIO4);
+ break;
+ case 13:
+ PIN_FUNC_SET(IO_MUX0_GPIO13, FUNC_GPIO13_GPIO13);
+ break;
+ case 15:
+ PIN_FUNC_SET(IO_MUX0_GPIO15, FUNC_GPIO15_GPIO15);
+ break;
+ }
}
void HAL_PIN_PWM_Start(int index, int freq)
@@ -262,9 +300,46 @@ void HAL_PIN_PWM_Start(int index, int freq)
if(index >= g_numPins)
return;
int ch = PIN_GetPWMIndexForPinIndex(index);
- g_pins[index].freq = freq;
if(ch < 0) return;
- pwm_init(ch);
+ g_pins[index].freq = freq;
+ pwm_stop(ch);
+ switch(index)
+ {
+ case 0:
+ PIN_FUNC_SET(IO_MUX0_GPIO0, FUNC_GPIO0_PWM_CTRL0);
+ break;
+ case 20:
+ PIN_FUNC_SET(IO_MUX0_GPIO20, FUNC_GPIO20_PWM_CTRL0);
+ break;
+ case 1:
+ PIN_FUNC_SET(IO_MUX0_GPIO1, FUNC_GPIO1_PWM_CTRL1);
+ break;
+ case 21:
+ PIN_FUNC_SET(IO_MUX0_GPIO21, FUNC_GPIO21_PWM_CTRL1);
+ break;
+ case 2:
+ PIN_FUNC_SET(IO_MUX0_GPIO2, FUNC_GPIO2_PWM_CTRL2);
+ break;
+ case 22:
+ PIN_FUNC_SET(IO_MUX0_GPIO22, FUNC_GPIO22_PWM_CTRL2);
+ break;
+ case 3:
+ PIN_FUNC_SET(IO_MUX0_GPIO3, FUNC_GPIO3_PWM_CTRL3);
+ break;
+ case 14:
+ PIN_FUNC_SET(IO_MUX0_GPIO14, FUNC_GPIO14_PWM_CTRL3);
+ break;
+ case 4:
+ PIN_FUNC_SET(IO_MUX0_GPIO4, FUNC_GPIO4_PWM_CTRL4);
+ break;
+ case 13:
+ PIN_FUNC_SET(IO_MUX0_GPIO13, FUNC_GPIO13_PWM_CTRL5);
+ break;
+ case 15:
+ PIN_FUNC_SET(IO_MUX0_GPIO15, FUNC_GPIO15_PWM_CTRL5);
+ break;
+ }
+ pwm_start(ch);
}
void HAL_PIN_PWM_Update(int index, float value)
@@ -273,10 +348,10 @@ void HAL_PIN_PWM_Update(int index, float value)
return;
int ch = PIN_GetPWMIndexForPinIndex(index);
if(ch < 0) return;
- if(value < 0)
- value = 0;
- if(value > 100)
- value = 100;
+ if(value < 0.1)
+ value = 0.1;
+ if(value >= 100)
+ value = 99.9;
pwm_config(ch, g_pins[index].freq, (uint32_t)(value * 10));
pwm_start(ch);
}
@@ -286,13 +361,49 @@ unsigned int HAL_GetGPIOPin(int index)
return index;
}
-void HAL_AttachInterrupt(int pinIndex, OBKInterruptType mode, OBKInterruptHandler function) {
-
-}
-void HAL_DetachInterrupt(int pinIndex) {
+OBKInterruptHandler g_handlers[PLATFORM_GPIO_MAX];
+OBKInterruptType g_modes[PLATFORM_GPIO_MAX];
+void TR6260_Interrupt(int obkPinNum)
+{
+ if(g_handlers[obkPinNum])
+ {
+ g_handlers[obkPinNum](obkPinNum);
+ }
}
+void HAL_AttachInterrupt(int pinIndex, OBKInterruptType mode, OBKInterruptHandler function)
+{
+ if(pinIndex >= g_numPins)
+ return;
+ g_handlers[pinIndex] = function;
+ trPinMapping_t* pin = g_pins + pinIndex;
+ gpio_isr_init();
+ uint32_t irqmode = DRV_GPIO_INT_NEG_EDGE;
+ switch(mode)
+ {
+ case INTERRUPT_RISING:
+ irqmode = DRV_GPIO_INT_POS_EDGE;
+ break;
+ case INTERRUPT_FALLING:
+ irqmode = DRV_GPIO_INT_NEG_EDGE;
+ break;
+ case INTERRUPT_CHANGE:
+ irqmode = DRV_GPIO_INT_DUAL_EDGE;
+ break;
+ }
+ gpio_irq_level(pin->pin, irqmode);
+ gpio_irq_callback_register(pin->pin, TR6260_Interrupt, pinIndex);
+ gpio_irq_unmusk(pin->pin);
+}
+void HAL_DetachInterrupt(int pinIndex)
+{
+ if(pinIndex >= g_numPins || g_handlers[pinIndex] == 0)
+ return;
+ trPinMapping_t* pin = g_pins + pinIndex;
+ gpio_irq_musk(pin->pin);
+ g_handlers[pinIndex] = 0;
+}
#endif // PLATFORM_TR6260