Skip to content

Commit 0ea5d2b

Browse files
committed
Fix: dtoverlay on Linux v4.19 failed in phandle insertion
1 parent c7026a4 commit 0ea5d2b

File tree

7 files changed

+141
-10
lines changed

7 files changed

+141
-10
lines changed

builddtbo.sh

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,9 @@
11
#dtoverlay -r seeed-2mic-voicecard
2+
DTC_FLAGS="-b 0 -Wno-unit_address_vs_reg -I dts -O dtb"
23

3-
dtc -@ -I dts -O dtb -o seeed-2mic-voicecard.dtbo seeed-2mic-voicecard-overlay.dts
4-
dtc -@ -I dts -O dtb -o seeed-4mic-voicecard.dtbo seeed-4mic-voicecard-overlay.dts
5-
dtc -@ -I dts -O dtb -o seeed-8mic-voicecard.dtbo seeed-8mic-voicecard-overlay.dts
4+
dtc -@ $DTC_FLAGS -o seeed-2mic-voicecard.dtbo seeed-2mic-voicecard-overlay.dts
5+
dtc -@ $DTC_FLAGS -o seeed-4mic-voicecard.dtbo seeed-4mic-voicecard-overlay.dts
6+
dtc -@ $DTC_FLAGS -o seeed-8mic-voicecard.dtbo seeed-8mic-voicecard-overlay.dts
67

78
# cp *.dtbo /boot/overlays
89
# dtoverlay seeed-2mic-voicecard

install.sh

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@ _VER_RUN=
3939
function get_kernel_version() {
4040
local ZIMAGE IMG_OFFSET
4141

42+
_VER_RUN=""
4243
[ -z "$_VER_RUN" ] && {
4344
ZIMAGE=/boot/kernel.img
4445
IMG_OFFSET=$(LC_ALL=C grep -abo $'\x1f\x8b\x08\x00' $ZIMAGE | head -n 1 | cut -d ':' -f 1)
@@ -173,6 +174,7 @@ git --git-dir=/etc/voicecard/.git --work-tree=/etc/voicecard/ commit -m "origin
173174
cp seeed-voicecard /usr/bin/
174175
cp seeed-voicecard.service /lib/systemd/system/
175176
systemctl enable seeed-voicecard.service
177+
systemctl start seeed-voicecard
176178

177179
echo "------------------------------------------------------"
178180
echo "Please reboot your raspberry pi to apply all settings"

seeed-8mic-voicecard-overlay.dts

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,13 +26,15 @@
2626
fragment@2 {
2727
target = <&gpio>;
2828
__overlay__ {
29-
spk_amp_and_irq_pins: speaker_amp_and_irq_pins {
29+
spk_amp_pins: spk_pins {
3030
brcm,pins = <17 22>;
3131
brcm,function = <1 0>; /* out in */
32+
brcm,pull = <0 0>; /* - - */
3233
};
3334
gpclk0_pins: gpclk0_pins {
3435
brcm,pins = <4>;
3536
brcm,function = <4>; /* alt func 0 */
37+
brcm,pull = <0>; /* - */
3638
};
3739
};
3840
};
@@ -47,7 +49,7 @@
4749
ac101: ac101@1a{
4850
compatible = "x-power,ac101";
4951
pinctrl-names = "default";
50-
pinctrl-0 = <&spk_amp_and_irq_pins>,<&gpclk0_pins>;
52+
pinctrl-0 = <&spk_amp_pins &gpclk0_pins>;
5153
spk-amp-switch-gpios = <&gpio 17 0>;
5254
switch-irq-gpios = <&gpio 22 0>;
5355
reg = <0x1a>;
@@ -80,6 +82,8 @@
8082
seeed-voice-card,name = "seeed-8mic-voicecard";
8183
seeed-voice-card,channels-playback-override = <8>;
8284
seeed-voice-card,channels-capture-override = <8>;
85+
#address-cells = <1>;
86+
#size-cells = <0>;
8387
status = "okay";
8488

8589
seeed-voice-card,dai-link@0 {
@@ -88,6 +92,7 @@
8892
frame-master = <&codec0_dai>;
8993
/* bitclock-inversion; */
9094
/* frame-inversion; */
95+
reg = <0>;
9196

9297
cpu {
9398
sound-dai = <&i2s>;

seeed-8mic-voicecard.dtbo

-6 Bytes
Binary file not shown.

seeed-voicecard

Lines changed: 78 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,56 @@ modprobe i2c-dev
2929
#enable spi interface
3030
dtparam spi=on
3131

32+
_VER_RUN=
33+
function get_kernel_version() {
34+
local ZIMAGE IMG_OFFSET
35+
36+
_VER_RUN=""
37+
[ -z "$_VER_RUN" ] && {
38+
ZIMAGE=/boot/kernel.img
39+
IMG_OFFSET=$(LC_ALL=C grep -abo $'\x1f\x8b\x08\x00' $ZIMAGE | head -n 1 | cut -d ':' -f 1)
40+
_VER_RUN=$(dd if=$ZIMAGE obs=64K ibs=4 skip=$(( IMG_OFFSET / 4)) | zcat | grep -a -m1 "Linux version" | strings | awk '{ print $3; }')
41+
}
42+
echo "$_VER_RUN"
43+
return 0
44+
}
45+
46+
CONFIG=/boot/config.txt
47+
get_overlay() {
48+
ov=$1
49+
if grep -q -E "^dtoverlay=$ov" $CONFIG; then
50+
echo 0
51+
else
52+
echo 1
53+
fi
54+
}
55+
56+
do_overlay() {
57+
ov=$1
58+
RET=$2
59+
DEFAULT=--defaultno
60+
CURRENT=0
61+
if [ $(get_overlay $ov) -eq 0 ]; then
62+
DEFAULT=
63+
CURRENT=1
64+
fi
65+
if [ $RET -eq $CURRENT ]; then
66+
ASK_TO_REBOOT=1
67+
fi
68+
if [ $RET -eq 0 ]; then
69+
sed $CONFIG -i -e "s/^#dtoverlay=$ov/dtoverlay=$ov/"
70+
if ! grep -q -E "^dtoverlay=$ov" $CONFIG; then
71+
printf "dtoverlay=$ov\n" >> $CONFIG
72+
fi
73+
STATUS=enabled
74+
elif [ $RET -eq 1 ]; then
75+
sed $CONFIG -i -e "s/^dtoverlay=$ov/#dtoverlay=$ov/"
76+
STATUS=disabled
77+
else
78+
return $RET
79+
fi
80+
}
81+
3282

3383
is_1a=$(i2cdetect -y 1 0x1a 0x1a | grep 1a | awk '{print $2}')
3484
is_35=$(i2cdetect -y 1 0x35 0x35 | grep 35 | awk '{print $2}')
@@ -37,9 +87,12 @@ is_3b=$(i2cdetect -y 1 0x3b 0x3b | grep 3b | awk '{print $2}')
3787
rm /etc/asound.conf
3888
rm /var/lib/alsa/asound.state
3989

90+
RPI_HATS="seeed-2mic-voicecard seeed-4mic-voicecard seeed-8mic-voicecard"
91+
overlay=""
92+
4093
if [ "x${is_1a}" == "x1a" ] && [ "x${is_35}" == "x" ] ; then
4194
echo "install 2mic"
42-
dtoverlay seeed-2mic-voicecard
95+
overlay=seeed-2mic-voicecard
4396
rm /etc/asound.conf
4497
rm /var/lib/alsa/asound.state
4598
echo "create 2mic asound configure file"
@@ -51,7 +104,7 @@ fi
51104

52105
if [ "x${is_3b}" == "x3b" ] && [ "x${is_35}" == "x" ] ; then
53106
echo "install 4mic"
54-
dtoverlay seeed-4mic-voicecard
107+
overlay=seeed-4mic-voicecard
55108
rm /etc/asound.conf
56109
rm /var/lib/alsa/asound.state
57110
echo "create 4mic asound configure file"
@@ -63,7 +116,7 @@ fi
63116

64117
if [ "x${is_3b}" == "x3b" ] && [ "x${is_35}" == "x35" ] ; then
65118
echo "install 6mic"
66-
dtoverlay seeed-8mic-voicecard
119+
overlay=seeed-8mic-voicecard
67120
rm /etc/asound.conf
68121
rm /var/lib/alsa/asound.state
69122
echo "create 6mic asound configure file"
@@ -73,9 +126,30 @@ if [ "x${is_3b}" == "x3b" ] && [ "x${is_35}" == "x35" ] ; then
73126
ln -s /etc/voicecard/ac108_6mic.state /var/lib/alsa/asound.state
74127
fi
75128

129+
if [ "$overlay" ]; then
130+
131+
echo Install $overlay ...
132+
dtoverlay $overlay
133+
134+
kernel_ver=$(get_kernel_version)
135+
# echo kernel_ver=$kernel_ver
136+
137+
# TODO: dynamic dtoverlay Bug of v4.19.x
138+
# no DT node phandle inserted.
139+
if [[ "$kernel_ver" =~ ^4\.19.*$ ]]; then
140+
for i in $RPI_HATS; do
141+
if [ "$i" == "$overlay" ]; then
142+
do_overlay $overlay 0
143+
else
144+
echo Uninstall $i ...
145+
do_overlay $i 1
146+
fi
147+
done
148+
fi
149+
fi
150+
76151
alsactl restore
77152

78153
#Fore 3.5mm ('headphone') jack
79154
amixer cset numid=3 1
80155

81-

seeed-voicecard.c

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -294,13 +294,19 @@ static int seeed_voice_card_dai_link_of(struct device_node *node,
294294
snprintf(prop, sizeof(prop), "%scpu", prefix);
295295
cpu = of_get_child_by_name(node, prop);
296296

297+
if (!cpu) {
298+
ret = -EINVAL;
299+
dev_err(dev, "%s: Can't find %s DT node\n", __func__, prop);
300+
goto dai_link_of_err;
301+
}
302+
297303
snprintf(prop, sizeof(prop), "%splat", prefix);
298304
plat = of_get_child_by_name(node, prop);
299305

300306
snprintf(prop, sizeof(prop), "%scodec", prefix);
301307
codec = of_get_child_by_name(node, prop);
302308

303-
if (!cpu || !codec) {
309+
if (!codec) {
304310
ret = -EINVAL;
305311
dev_err(dev, "%s: Can't find %s DT node\n", __func__, prop);
306312
goto dai_link_of_err;

uninstall.sh

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,42 @@ fi
1313

1414
uname_r=$(uname -r)
1515

16+
CONFIG=/boot/config.txt
17+
get_overlay() {
18+
ov=$1
19+
if grep -q -E "^dtoverlay=$ov" $CONFIG; then
20+
echo 0
21+
else
22+
echo 1
23+
fi
24+
}
25+
26+
do_overlay() {
27+
ov=$1
28+
RET=$2
29+
DEFAULT=--defaultno
30+
CURRENT=0
31+
if [ $(get_overlay $ov) -eq 0 ]; then
32+
DEFAULT=
33+
CURRENT=1
34+
fi
35+
if [ $RET -eq $CURRENT ]; then
36+
ASK_TO_REBOOT=1
37+
fi
38+
if [ $RET -eq 0 ]; then
39+
sed $CONFIG -i -e "s/^#dtoverlay=$ov/dtoverlay=$ov/"
40+
if ! grep -q -E "^dtoverlay=$ov" $CONFIG; then
41+
printf "dtoverlay=$ov\n" >> $CONFIG
42+
fi
43+
STATUS=enabled
44+
elif [ $RET -eq 1 ]; then
45+
sed $CONFIG -i -e "s/^dtoverlay=$ov/#dtoverlay=$ov/"
46+
STATUS=disabled
47+
else
48+
return $RET
49+
fi
50+
}
51+
1652

1753
echo "remove dtbos"
1854
rm /boot/overlays/seeed-2mic-voicecard.dtbo || true
@@ -37,6 +73,13 @@ rm /lib/modules/${uname_r}/kernel/sound/soc/codecs/snd-soc-wm8960.ko || true
3773
rm /lib/modules/${uname_r}/kernel/sound/soc/codecs/snd-soc-ac108.ko || true
3874
rm /lib/modules/${uname_r}/kernel/sound/soc/bcm/snd-soc-seeed-voicecard.ko || true
3975

76+
echo "remove $CONFIG configuration"
77+
RPI_HATS="seeed-2mic-voicecard seeed-4mic-voicecard seeed-8mic-voicecard"
78+
for i in $RPI_HATS; do
79+
echo Uninstall $i ...
80+
do_overlay $i 1
81+
done
82+
4083
echo "------------------------------------------------------"
4184
echo "Please reboot your raspberry pi to apply all settings"
4285
echo "Thank you!"

0 commit comments

Comments
 (0)