Alternative Heartbeat LED
- Operation confirmed with our ODROID-C2 on 3.14.79-117 kernel.
You can remap the blue heartbeat LED to other pin.
Check the default value from the Device Tree Source
The default GPIO pin for the heartbeat signal is GPIOAO_13.
Check this out.
https://github.com/hardkernel/linux/blob/odroidc2-3.14.y/arch/arm64/boot/dts/meson64_odroidc2.dts#L777
... leds: gpio_leds { compatible = "gpio-leds"; pinctrl-names = "led_pins"; pinctrl-0 = <&led_pins>; /* Blue LED */ heartbeat { label = "blue:heartbeat"; gpios = <&gpio_ao GPIOAO_13 GPIO_ACTIVE_LOW>; linux,default-trigger = "heartbeat"; }; }; ...
The gpios property in the heartbeat child node has 3 parameters, &gpio_ao, GPIOAO_13, GPIO_ACTIVE_LOW.
- &gpio_ao indicates a pin bank for a pin that would be used.
- GPIOAO_13 indicates a pin for a heartbeat LED.
- GPIO_ACTIVE_LOW is a flag for when the GPIO pin will be active. If in GPIO_ACTIVE_LOW, this GPIO pin is active when the output signal is 0.
The written pin GPIOAO_13 by default indicates a blue LED on the board so that the LED is heartbeat-ing as we expected.
So if you want to use the other GPIO pin for an alternative, you can easily achieve that by changing the pin bank and pin number at that line.
A tool, device-tree-compiler, can make you do that easier.
Install the package
Install device-tree-compiler by the following commands.
- target
root@odroid64:~# apt install device-tree-compiler
Now you can use fdtget and fdtput commands which makes us editing DTS without bothersome building a new kernel.
First, find out what is the current parameters in the gpios property.
- target
root@odroid64:~# fdtget /media/boot/meson64_odroidc2.dtb /gpio_leds/heartbeat gpios 37 13 1
We already know that the parameters of gpios property are: <&gpio_ao GPIOAO_13 GPIO_ACTIVE_LOW>.
This result shows them in order in number.
How to know the correct number we'd like to use
That result let us know that the pin bank &gpio_ao is shown as number 37.
In the same way, I've found that the &gpio pin bank commonly used at the 40 pin header is shown as number 19.
And you can refer to include/dt-bindings/gxbb.h file to know the number of a pin.
There're only 3 groups used at the 40 pin header, GPIOX, GPIOY, GPIODV. See the table below.
You can't use all of the pins below but just some of them. Please refer to this page: Expansion Connectors
X | Y | DV | |||||||||
---|---|---|---|---|---|---|---|---|---|---|---|
GPIOX_# | # | GPIOX_# | # | GPIOX_# | # | GPIOY_# | # | GPIOY_# | # | GPIODV_# | # |
0 | 92 | 11 | 103 | 22 | 114 | 0 | 75 | 11 | 86 | 24 | 69 |
1 | 93 | 12 | 104 | 1 | 76 | 12 | 87 | 25 | 70 | ||
2 | 94 | 13 | 105 | 2 | 77 | 13 | 88 | ||||
3 | 95 | 14 | 106 | 3 | 78 | 14 | 89 | ||||
4 | 96 | 15 | 107 | 4 | 79 | 15 | 90 | ||||
5 | 97 | 16 | 108 | 5 | 80 | 16 | 91 | ||||
6 | 98 | 17 | 109 | 6 | 81 | ||||||
7 | 99 | 18 | 110 | 7 | 82 | ||||||
8 | 100 | 19 | 111 | 8 | 83 | ||||||
9 | 101 | 20 | 112 | 9 | 84 | ||||||
10 | 102 | 21 | 113 | 10 | 85 |
Lastly, GPIO_ACTIVE_{HIGH|LOW} is the only thing you should choose.
If the positive(+) side of the LED is connected to 3.3V via a register, and the negative(-) side of the LED is connected to the GPIO pin you set, you should use GPIO_ACTIVE_HIGH.
Or if the positive(+) side of the LED is connected to the GPIO pin you set via a register, and the negative(-) side of the LED is connected to the ground, you should use GPIO_ACTIVE_LOW.
Actually it depends on your system, choose the proper one by the environment you're in.
And the number of these options are,
- GPIO_ACTIVE_HIGH: 0
- GPIO_ACTIVE_LOW: 1
Refer to include/dt-bindings/gpio/gpio.h file to see the actual definition.
Now we know everything we should know.
Finally we can make the other pin at the 40 pin header as a heartbeat LED.
Change the heartbeat LED
To test, I've connected our Tinkering Kit to my C2.
And I've set the test environment with a register and a LED that sets with the positive(+) side of the LED is connected to the GPIO pin #13 via a 330Ω register, and the negative(-) side of the LED is connected to the ground.
Please see the picture below.
On C2, it does by simply enter the proper command.
Since I've connected the pin at the GPIO pin #13(GPIOX_11), I'll enter 96(pin bank) 103(pin number) as first two parameters.
And I need to add a parameter 0(GPIO_ACTIVE_LOW) to show the heartbeat properly.
Don't forget that you should reboot to have effect.
- target
root@odroid64:~# fdtput /media/boot/meson64_odroidc2.dtb /gpio_leds/heartbeat gpios 96 103 0 root@odroid64:~# reboot
After the reboot, the LED heartbeats like a blue LED on the board before.
You can check whether the changes written in Device Tree well or not.
- target
root@odroid64:~# fdtget /media/boot/meson64_odroidc2.dtb /gpio_leds/heartbeat gpios 96 103 0
To back to the default, enter the following commands.
- target
root@odroid64:~# fdtput /media/boot/meson64_odroidc2.dtb /gpio_leds/heartbeat gpios 37 13 1 root@odroid64:~# reboot
Surely you can use the other pin you want by following this guide.