I want to run DS18B20 on the Rock PI S device using the default pin “GPIO0_C1”.
The devicetree file “rk3308-w1-gpio.dts” contains this:
// Definitions for w1-gpio module (without external pullup)
/dts-v1/;
/plugin/;
/ {
compatible = "rockchip,rk3308";
fragment@0 {
target-path = "/";
__overlay__ {
w1: onewire@0 {
compatible = "w1-gpio";
pinctrl-names = "default";
gpios = <&gpio0 17 0 0xae>; // GPIO0_C1
status = "okay";
};
};
};
};
So at startup the pin used for 1-wire is “GPIO0_C1”.
Then I activate the overlay in the “uEnv.txt” file:
overlays=rk3308-uart0 rk3308-w1-gpio
param_w1_pin=GPIO0_C1
I verify that the “/etc/modules” file contains:
# 1-wire temperature
w1-gpio
w1-therm
Everything looks fine, I reboot.
On restart I check if everything is configured correctly.
Pin configuration at boot:
Applying kernel provided DT fixup script (rockchip-fixup.scr)
## Executing script at 05000000
tmp_pinctrl=0
tmp_bank=C
tmp_pin=1
GPIO0_C1 ---> pinctrl = 0
GPIO0_C1 ---> bank = 10
GPIO0_C1 ---> pin = 11
GPIO0_C1 ---> tmp_pinctrl = /pinctrl/gpio0@ff220000
GPIO0_C1 ---> tmp_phandle = 0x00000075
Loading kernel modules:
~$ lsmod
Module Size Used by
w1_therm 16384 0
w1_gpio 16384 0
wire 28672 2 w1_gpio,w1_therm
cn 16384 1 wire
I check if the hardware pin is used by 1-wire:
~$ sudo cat /sys/kernel/debug/gpio
GPIOs 0-31, platform/pinctrl, gpio0:
gpio-2 ( |reset ) out hi
gpio-5 ( |? ) out lo
gpio-6 ( |? ) out hi
gpio-7 ( |mdio-reset ) out hi
gpio-11 ( |w1 ) in hi
gpio-21 ( |vcc_otg_vbus ) out hi
GPIOs 32-63, platform/pinctrl, gpio1:
GPIOs 64-95, platform/pinctrl, gpio2:
GPIOs 96-127, platform/pinctrl, gpio3:
GPIOs 128-159, platform/pinctrl, gpio4:
gpio-135 ( |bt_default_rts ) out hi
gpio-139 ( |bt_default_poweron ) out hi
gpio-140 ( |bt_default_wake_host) in hi
gpio-158 ( |vcc_sd ) out lo
The pin “gpio-11” is used by “w1” but it’s wrong it should be “gpio-17”.
I have 3 DS18B20 probes, checking if they are recognized:
~$ ls /sys/bus/w1/devices/
w1_bus_master1
No 1-wire probes are recognized (on Raspberry PI, they are recognized regularly)
After some trial and error, I removed the pin configuration “param_w1_pin = GPIO0_C1” from the “uEnv.txt” file, leaving only the overlay:
overlays=rk3308-uart0 rk3308-w1-gpio
Reboot the device and double check:
~$ lsmod
Module Size Used by
w1_therm 16384 0
w1_gpio 16384 0
wire 28672 2 w1_gpio,w1_therm
cn 16384 1 wire
~$ sudo cat /sys/kernel/debug/gpio
GPIOs 0-31, platform/pinctrl, gpio0:
gpio-2 ( |reset ) out hi
gpio-5 ( |? ) out lo
gpio-6 ( |? ) out hi
gpio-7 ( |mdio-reset ) out hi
gpio-17 ( |w1 ) in hi
gpio-21 ( |vcc_otg_vbus ) out hi
GPIOs 32-63, platform/pinctrl, gpio1:
GPIOs 64-95, platform/pinctrl, gpio2:
GPIOs 96-127, platform/pinctrl, gpio3:
GPIOs 128-159, platform/pinctrl, gpio4:
gpio-135 ( |bt_default_rts ) out hi
gpio-139 ( |bt_default_poweron ) out hi
gpio-140 ( |bt_default_wake_host) in hi
gpio-158 ( |vcc_sd ) out lo
The pin “gpio-17” is the correct one and used by “w1”.
I have 3 DS18B20 probes, checking if they are recognized:
~# ls /sys/bus/w1/devices/
28-3c01d6175060 28-3c01d6175930 28-3c01d6176090 w1_bus_master1
From this I deduce that the “rockchip-fixup.scr” script has some problem calculating the right hardware pin:
Applying kernel provided DT fixup script (rockchip-fixup.scr)
## Executing script at 05000000
tmp_pinctrl=0
tmp_bank=C
tmp_pin=1
GPIO0_C1 ---> pinctrl = 0
GPIO0_C1 ---> bank = 10
GPIO0_C1 ---> pin = 11
GPIO0_C1 ---> tmp_pinctrl = /pinctrl/gpio0@ff220000
GPIO0_C1 ---> tmp_phandle = 0x00000075
The “bank” should perhaps be “0” and the “pin” 17 ", don’t you think ?
Source of the “rockchip-fixup.scr” script:
# overlays fixup script
# implements (or rather substitutes) overlay arguments functionality
# using u-boot scripting, environment variables and "fdt" command
setenv decompose_pin 'setexpr tmp_pinctrl sub "GPIO(0|1|2|3|4)_\\S\\d+" "\\1";
setexpr tmp_bank sub "GPIO\\d_(\\S)\\d+" "\\1";
test "${tmp_bank}" = "A" && setenv tmp_bank 0;
test "${tmp_bank}" = "B" && setenv tmp_bank 1;
test "${tmp_bank}" = "C" && setenv tmp_bank 2;
test "${tmp_bank}" = "D" && setenv tmp_bank 3;
setexpr tmp_pin sub "GPIO\\d_\\S(\\d+)" "\\1";
setexpr tmp_bank ${tmp_bank} * 8;
setexpr tmp_pin ${tmp_bank} + ${tmp_pin}'
if test -n "${param_spidev_spi_bus}"; then
test "${param_spidev_spi_bus}" = "0" && setenv tmp_spi_path "spi@ff120000"
test "${param_spidev_spi_bus}" = "1" && setenv tmp_spi_path "spi@ff130000"
test "${param_spidev_spi_bus}" = "2" && setenv tmp_spi_path "spi@ff140000"
fdt set /${tmp_spi_path} status "okay"
fdt set /${tmp_spi_path}/spidev status "okay"
if test -n "${param_spidev_max_freq}"; then
fdt set /${tmp_spi_path}/spidev spi-max-frequency "<${param_spidev_max_freq}>"
fi
fi
if test -n "${param_w1_pin}"; then
setenv tmp_pinctrl "${param_w1_pin}"
setenv tmp_bank "${param_w1_pin}"
setenv tmp_pin "${param_w1_pin}"
run decompose_pin
echo "${param_w1_pin} ---> pinctrl = ${tmp_pinctrl}"
echo "${param_w1_pin} ---> bank = ${tmp_bank}"
echo "${param_w1_pin} ---> pin = ${tmp_pin}"
fdt get value tmp_pinctrl /__symbols__ gpio${tmp_pinctrl}
echo "${param_w1_pin} ---> tmp_pinctrl = ${tmp_pinctrl}"
fdt get value tmp_phandle ${tmp_pinctrl} phandle
echo "${param_w1_pin} ---> tmp_phandle = ${tmp_phandle}"
fdt set /onewire@0 gpios "<${tmp_phandle} ${tmp_pin} 0 0>"
env delete tmp_pinctrl tmp_bank tmp_pin tmp_phandle
fi
Does anyone know the “uboot” language to verify the script and maybe correct it ?
debugasm