逍遥游

数码视讯Q7 的垃圾电视盒30元一个,S905L芯片, A53 x 4 ,1G RAM , 可以跑很多东西,本来想跑一些nas应用,后来猫盘,什么我家云等矿渣也不断出来,就放弃, 现在计划拿来跑AI的一些视频识别应用.

armbian 上面针对S905的都没有rtl8189的驱动,那就自己加

下载virtul box, 在上面跑一个unbutu的虚拟机,这里必须用官方mini.iso来安装.不能用18.4.3 这个官方推荐版本,说来都是泪,说白了就是版本依赖的问题.

下载armbian build脚本,我们用150balbes 针对s905的版本

1
2
3
git clone https://github.com/150balbes/Build-Armbian
cd Build-Armbian
./compile.sh BOARD=aml-g12 BRANCH=default RELEASE=bionic BUILD_MINIMAL=no BUILD_DESKTOP=no KERNEL_ONLY=no KERNEL_CONFIGURE=yes

下面这段话是别人的

1
2
3
4
5
6
7
BOARD 设置为 aml-g12,可以选 aml-s905,但是只有 aml-g12 编译时用的源码是最新的
BRANCH 编译使用的源码分支 在 105 的 build 中,default 使用的是他自己 fork 的 S905 kernel 源码
RELEASE 为需要编译的版本,我这里设置为 Ubuntu 19.04 disco,可以选择 buster bionic stretch xenial 等
BUILD_MINIMAL 是否为最小版本,这个选项改为 yes 之后,没有 armbian-config 了,所以还是把它改为了 no
BUILD_DESKTOP 是否编译桌面版本
KERNEL_ONLY 是否只编译内核
KERNEL_CONFIGURE 是否在开始编译是打开内核配置,这个选项需要设置为 yes,来添加我们需要的 WIFI 驱动

修改 /Build-Armbian/lib/compilation-prepare.sh 脚本

增加下载编译rtl8189的代码
代码在这里 https://github.com/jwrdegoede/rtl8189ES_linux

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
# Wireless drivers for Realtek 8189ES  chipsets

if linux-version compare $version ge 3.14 && [ "$EXTRAWIFI" == yes ]; then

# attach to specifics tag or branch
local rtl8189es="branch:rtl8189fs" #必须用这个分支

display_alert "Adding" "Wireless drivers for Realtek 8189fs chipsets ${rtl8189es}" "info"

fetch_from_repo "https://github.com/jwrdegoede/rtl8189ES_linux" "rtl8189fs" "${rtl8189es}" "yes"
cd ${SRC}/cache/sources/${LINUXSOURCEDIR}
rm -rf ${SRC}/cache/sources/${LINUXSOURCEDIR}/drivers/net/wireless/rtl8189fs
mkdir -p ${SRC}/cache/sources/${LINUXSOURCEDIR}/drivers/net/wireless/rtl8189fs/
cp -R ${SRC}/cache/sources/rtl8189fs/${rtl8189es#*:}/{core,hal,include,os_dep,platform} \
${SRC}/cache/sources/${LINUXSOURCEDIR}/drivers/net/wireless/rtl8189fs

# Makefile
cp ${SRC}/cache/sources/rtl8189fs/${rtl8189es#*:}/Makefile \
${SRC}/cache/sources/${LINUXSOURCEDIR}/drivers/net/wireless/rtl8189fs/Makefile
cp ${SRC}/cache/sources/rtl8189fs/${rtl8189es#*:}/Kconfig \
${SRC}/cache/sources/${LINUXSOURCEDIR}/drivers/net/wireless/rtl8189fs/Kconfig

# Add to section Makefile
echo "obj-\$(CONFIG_RTL8189FS) += rtl8189fs/" >> $SRC/cache/sources/${LINUXSOURCEDIR}/drivers/net/wireless/Makefile
sed -i '/source "drivers\/net\/wireless\/ti\/Kconfig"/a source "drivers\/net\/wireless\/rtl8189fs\/Kconfig"' \
$SRC/cache/sources/${LINUXSOURCEDIR}/drivers/net/wireless/Kconfig

fi

然后就重新编译就可以, 上面看上去好像很简单,我也搞了几天.

下面这段事别人的, https://blog.csdn.net/jklinux/article/details/78737691

我复制过来, 有时候有用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
通过检查电路原理图,可以发现此wifi芯片是连接到板上mmc1控制器上的。H5共有三个sd/mmc控制器, 而控制器驱动是platform_driver, 需要用platform_device或在设备树里提供硬件控制器的硬件资源.

在H5的设备树sunxi-h3-h5.dtsi文件里,而描述好三个sd/mmc控制器的设备节点:

mmc0: mmc@01c0f000 {
/* compatible and clocks are in per SoC .dtsi file */
reg = <0x01c0f000 0x1000>;
resets = <&ccu RST_BUS_MMC0>;
reset-names = "ahb";
interrupts = <GIC_SPI 60 IRQ_TYPE_LEVEL_HIGH>;
status = "enabled";
#address-cells = <1>;
#size-cells = <0>;
};

mmc1: mmc@01c10000 {
/* compatible and clocks are in per SoC .dtsi file */
reg = <0x01c10000 0x1000>;
resets = <&ccu RST_BUS_MMC1>;
reset-names = "ahb";
interrupts = <GIC_SPI 61 IRQ_TYPE_LEVEL_HIGH>;
status = "enabled";
#address-cells = <1>;
#size-cells = <0>;
};

mmc2: mmc@01c11000 {
/* compatible and clocks are in per SoC .dtsi file */
reg = <0x01c11000 0x1000>;
resets = <&ccu RST_BUS_MMC2>;
reset-names = "ahb";
interrupts = <GIC_SPI 62 IRQ_TYPE_LEVEL_HIGH>;
status = "enabled";
#address-cells = <1>;
#size-cells = <0>;
};

但三个设备节点的status属性值不是”okay”的话,是不会生效的. 而且还需要提供sd/mmc控制器使用的gpio口配置信息.

在设备树文件sun50i-h5-nanopi-neo2.dts里,已提供让mmc0控制器生效的设备节点:

&mmc0 {
pinctrl-names = "default";
pinctrl-0 = <&mmc0_pins_a>, <&mmc0_cd_pin>;
vmmc-supply = <&reg_vcc3v3>;
bus-width = <4>;
cd-gpios = <&pio 5 6 GPIO_ACTIVE_LOW>; /* PF6 */
boot_device = <1>;
status = "okay";
};

所以要想使用mmc1控制器,再增加一个mmc的设备节点即可:

&mmc1 {
pinctrl-names = "default";
pinctrl-0 = <&mmc1_pins_a>;
vmmc-supply = <&reg_vcc3v3>;
bus-width = <4>;
status = "okay";
};

修改完成后更新使用设备树,进入系统后:

//查看到已有两个设备与sd/mmc控制器的驱动匹配上了:
^_^ / # ls /sys/bus/platform/drivers/sunxi-mmc/
1c0f000.mmc/ 1c10000.mmc/ bind uevent unbind

sd/mmc控制器驱动好后,它会自动读取sdio设备的信息,并在系统里创建出相应的sdio设备信息:

这里可以获取到wifi芯片的厂家和设备id, wifi设备驱动里是根据这些id来作匹配的.

^_^ / # cat /sys/bus/sdio/devices/mmc2\:0001\:1/device
0xf179
^_^ / # cat /sys/bus/sdio/devices/mmc2\:0001\:1/vendor
0x024c

通过官网的说明: http://linux-sunxi.org/Wifi#RTL8189FTV
rtl8189ftv型号的wifi用的就是rtl8189ES驱动. 与型号8189fs一致.

下载驱动源码: git clone https://github.com/jwrdegoede/rtl8189ES_linux.git
git checkout -b rtl8189fs origin/rtl8189fs //下载8189fs的分支
git pull //检查更新
1
2
3
4
驱动源码下载后, 可以发现此驱动源码是可以支持很多个型号的wifi芯片.

在驱动源码os_dep/linux/sdio_intf.c文件里, 可以看到匹配用的设备id表:

47 static const struct sdio_device_id sdio_ids[] =
48 {
49 #ifdef CONFIG_RTL8723B
50 { SDIO_DEVICE(0x024c, 0xB723),.driver_data = RTL8723B},
51 #endif
52 #ifdef CONFIG_RTL8188E
53 { SDIO_DEVICE(0x024c, 0x8179),.driver_data = RTL8188E},
54 #endif //CONFIG_RTL8188E
55
56 #ifdef CONFIG_RTL8821A
57 { SDIO_DEVICE(0x024c, 0x8821),.driver_data = RTL8821},
58 #endif //CONFIG_RTL8821A
59
60 #ifdef CONFIG_RTL8192E
61 { SDIO_DEVICE(0x024c, 0x818B),.driver_data = RTL8192E},
62 #endif //CONFIG_RTL8192E
63
64 #ifdef CONFIG_RTL8703B
65 { SDIO_DEVICE(0x024c, 0xB703), .driver_data = RTL8703B},
66 #endif
67
68 #ifdef CONFIG_RTL8188F //rtl8189ftv的厂家和设备id
69 {SDIO_DEVICE(0x024c, 0xF179), .driver_data = RTL8188F},
70 #endif
....

98 static struct sdio_drv_priv sdio_drvpriv = {
99 .r871xs_drv.probe = rtw_drv_init,
100 .r871xs_drv.remove = rtw_dev_remove,
101 .r871xs_drv.name = (char*)DRV_NAME,
102 .r871xs_drv.id_table = sdio_ids,
103 #if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,29))
104 .r871xs_drv.drv = {
105 .pm = &rtw_sdio_pm_ops,
106 }
107 #endif
108 };


具体要编译支持哪个芯片,需要修改里面的Makefile.
//只要作了git checkout … 里面会自动修改支持8189ftv/818fs的.
Makefile里的内容:

38 CONFIG_RTL8188F = y
39 ######################### Interface ###########################
40 CONFIG_USB_HCI = n
41 CONFIG_PCI_HCI = n
42 CONFIG_SDIO_HCI = y

//需要修改的内容:
114 CONFIG_PLATFORM_ARM_SUNxI = y
...
1373 ARCH := arm64

1375 CROSS_COMPILE=aarch64-linux-gnu-
...
1378 KSRC=~/fH5/NanoPi-NEO2/sources/linux/

修改完成后,执行Makefile, 最终会生成8189fs.ko。在板上系统加载此驱动模块后,会有”wlan0”网络设备.
————————————————
版权声明:本文为CSDN博主「jklinux」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/jklinux/article/details/78737691