Part 3: LEDs, Buttons and Relays
Finding the connections
With all the information gathered so far, it shouldn’t be too hard to find out, how the LEDs, the relay and the button are connected to the CPU. Most probably, they are all connected to some GPIO port.
According to the data sheet, the MT7688 has 96 GPIO lines and the GPIO control registers start at address 0x10000600.
We let the device boot regulary and then switch to the CLI’s os
section.
Playing with the reg w
and reg r
commands quickly gives us
the following information:
- The relay is connected to GPIO 32
- The red LED is connected to GPIO 33
- The green LED is connected to GPIO 34
- The button is connected to GPIO 35
So, the following command switches the relay:
reg w 10000634 1 # Switch relay on
reg w 10000644 1 # Switch relay off
and the following command switches the LEDs:
reg w 10000644 6 # Switch both LEDs on
reg w 10000634 6 # Switch both LEDs off
and bit 3 from the following command tells us, whether or not the button is currently pressed:
reg r 10000624 # bit 3 == 0 -> button pressed
You shouldn’t press the button too long: a four to five seconds press performs a factory reset of the device.
Note that the polarity for switching the relay and the LEDs is inverted, but this is a pure software feature, because the polarity of the GPIO ports can be configured.
Does this work from u-boot too?
Next step is to test this from a lower level, i.e. from the u-boot
command line. We can use the nm
and mm
commands to write to
the registers. Of course, the naive approach to just repeat the
commands from above doesn’t work: the SoC needs to be configured to
actually use the GPIOs. The MSS310 application does this, but u-boot
doesn’t (it does, however, configure the UART). We need to set the
following registers to make the GPIOs available:
0x10000064 -> 0x05550550
0x10000604 -> 0x00000007 # Configure bits 0..2 as output
Afterwards, we can control the LEDs and the relay from the u-boot command line.
Notes:
- 0x10000064 is the GPIO2_MODE register
- the value of the lower 16 bits is irrelevant here, these bits are only relevant for the MT7628AN SoC. Only the upper 16 bits are for the MT7628KN. Actually the reset value should be o.k. It configures the four PHY leds to be controlled from GPIO.