Skip to content

Commit e1e9ea2

Browse files
paolovolpixiaoxiang781216
authored andcommitted
RP2350B has 48 gpio, highers 16 accessed by "HI" registers
1 parent a20ac0f commit e1e9ea2

File tree

1 file changed

+70
-6
lines changed

1 file changed

+70
-6
lines changed

arch/arm/src/rp23xx/rp23xx_gpio.h

Lines changed: 70 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -103,10 +103,11 @@ extern "C"
103103

104104
static inline void rp23xx_gpio_put(uint32_t gpio, int set)
105105
{
106-
uint32_t value = 1 << gpio;
107-
108106
DEBUGASSERT(gpio < RP23XX_GPIO_NUM);
109107

108+
#if (RP23XX_GPIO_NUM <= 32)
109+
uint32_t value = 1 << gpio;
110+
110111
if (set)
111112
{
112113
putreg32(value, RP23XX_SIO_GPIO_OUT_SET);
@@ -115,23 +116,61 @@ static inline void rp23xx_gpio_put(uint32_t gpio, int set)
115116
{
116117
putreg32(value, RP23XX_SIO_GPIO_OUT_CLR);
117118
}
119+
#else
120+
uint32_t mask = 1ul << (gpio & 0x1fu);
121+
if (gpio < 32)
122+
{
123+
if (set)
124+
{
125+
putreg32(mask, RP23XX_SIO_GPIO_OUT_SET);
126+
}
127+
else
128+
{
129+
putreg32(mask, RP23XX_SIO_GPIO_OUT_CLR);
130+
}
131+
}
132+
else
133+
{
134+
if (set)
135+
{
136+
putreg32(mask, RP23XX_SIO_GPIO_HI_OUT_SET);
137+
}
138+
else
139+
{
140+
putreg32(mask, RP23XX_SIO_GPIO_HI_OUT_CLR);
141+
}
142+
}
143+
#endif
118144
}
119145

120146
static inline bool rp23xx_gpio_get(uint32_t gpio)
121147
{
122-
uint32_t value = 1 << gpio;
123-
124148
DEBUGASSERT(gpio < RP23XX_GPIO_NUM);
125149

150+
#if (RP23XX_GPIO_NUM <= 32)
151+
uint32_t value = 1 << gpio;
126152
return (getreg32(RP23XX_SIO_GPIO_IN) & value) != 0;
153+
#else
154+
if (gpio < 32)
155+
{
156+
uint32_t value = 1 << gpio;
157+
return (getreg32(RP23XX_SIO_GPIO_IN) & value) != 0;
158+
}
159+
else
160+
{
161+
uint32_t value = 1 << (gpio -32);
162+
return (getreg32(RP23XX_SIO_GPIO_HI_IN) & value) != 0;
163+
}
164+
#endif
127165
}
128166

129167
static inline void rp23xx_gpio_setdir(uint32_t gpio, int out)
130168
{
131-
uint32_t value = 1 << gpio;
132-
133169
DEBUGASSERT(gpio < RP23XX_GPIO_NUM);
134170

171+
#if (RP23XX_GPIO_NUM <= 32)
172+
uint32_t value = 1 << gpio;
173+
135174
if (out)
136175
{
137176
putreg32(value, RP23XX_SIO_GPIO_OE_SET);
@@ -140,6 +179,31 @@ static inline void rp23xx_gpio_setdir(uint32_t gpio, int out)
140179
{
141180
putreg32(value, RP23XX_SIO_GPIO_OE_CLR);
142181
}
182+
#else
183+
uint32_t mask = 1ul << (gpio & 0x1fu);
184+
if (gpio < 32)
185+
{
186+
if (out)
187+
{
188+
putreg32(mask, RP23XX_SIO_GPIO_OE_SET);
189+
}
190+
else
191+
{
192+
putreg32(mask, RP23XX_SIO_GPIO_OE_CLR);
193+
}
194+
}
195+
else
196+
{
197+
if (out)
198+
{
199+
putreg32(mask, RP23XX_SIO_GPIO_HI_OE_SET);
200+
}
201+
else
202+
{
203+
putreg32(mask, RP23XX_SIO_GPIO_HI_OE_CLR);
204+
}
205+
}
206+
#endif
143207
}
144208

145209
/****************************************************************************

0 commit comments

Comments
 (0)