接着上一篇文章
3.内核电源、串口配置,内核烧录
首先要创建一个新的设备树文件,比如arch/arm64/boot/dts/rockchip/rk3568-gi3568b-v10.dts,然后include一下RK官方开发板的dtsi文件。目前很多RK的产品硬件是在RK公版方案基础上修改而来的。

找到GI-3568-B和RK公版方案的差异之处,在这个文件里面配置即可。
在原理图里面有介绍过它的电源框架

这个板上有两个电源芯片的电压是可以调节的,一个是RK809,有多个DCDC和LDO,给RK3568的多组IO供电,另外一个是TCS4525,给CPU供电。需要注意TCS4525在内核里面的驱动文件是kernel/drivers/regulator/fan53555.c,如果是自己的defconfig,要打开这个选项。


按照上面表格的电压设置要求,需要改一下VCCIO的供电电压

这里串口的波特率也是要改的,加上这个内容即可

然后进行编译。
android的boot.img实际上应该包含内核映像+设备树+ramdisk,ramdisk在编译Android的时候会编译出来,然后用./mkimage.sh打包的时候,会把kernel编译输出的kernel.img resource.img以及out目录下的ramdisk合并为一个boot.img,放到rockdev下面
如果不想每次都执行mkimage.sh,可以用下面的命令进行编译,这样输出的boot.img会包含ramdisk
make ARCH=arm64 rk3568-gi3568b-v10.img BOOT_IMG=../rockdev/Image-rk3568_test/boot.img -j8
将编译出来的boot.img烧录到板上

可以看到内核启动的信息

4.双以太网功能调试
板上带了两路以太网,使用的是rgmii接口,phy芯片为裕太微电子的YT8521S。官网介绍如下

板上硬件接线如下


这里要注意它的时钟配置,这个YT8521S自身的时钟由外部晶振提供,至于那个TXCLK 所需时钟,可以由PHY提供,也可以由RK3568提供,不过RK文档上面有提

故这里采取RK3568输出TXCLK的方式
注意PHY的复位脚,这个PHY芯片是要上电时复位的。PHY0对应的那一路复位脚为GPIO2_D1,PHY1对应的那一路为GPIO2_D3,复位脚低电平有效。
PHY另外还有中断脚接到主控,应该是用来做以太网唤醒的,这种功能暂时用不到,后面再介绍。
故最终设备树配置如下


这里另外有tx_delay和rx_delay参数,需要先编译一个固件到板上运行,然后再调试。按上面所述方法编译一个boot.img并烧录,然后找一根网线连接GI-3568-B和电脑(或者路由器)
首先要确认eth0和eth1的对应关系,系统启动之后执行

在顶层的设备树rk3568.dtsi中有


可以发现它gmac0对应的是eth1,而gmac1对应的是eth0
现在以eth1为例进行调试,它用的是板上的J14,也就是这个网口

板上执行ifconfig eth1 192.168.1.2 up
然后PC端设置静态IP 192.168.1.10,网关192.168.1.1,PC端使用cmd进行ping操作

这样说明以太网已经正常工作,接下来需要调整tx_delay和rx_delay,输入命令
echo 1000 > /sys/devices/platform/fe2a0000.ethernet/phy_lb_scan
最终得到结果

将这两个值填到设备树上即可。
gmac1对应的eth0测试方法类似,这里不再赘述。
5.WiFi/蓝牙调试
板上的WiFi/蓝牙模组为AP6256,其规格如下

WiFi是SDIO接口的,蓝牙使用的是带了流控的串口,WiFi和蓝牙的电源是分开控制的,其原理图如下

可以看出是SDMMC2接WiFi,然后GPIO3_B7控制WiFi电源,因此将reset-gpios设置为GPIO3_B7,然后这里是低电平的时候WiFi模组不工作,因此设置GPIO_ACTIVE_LOW。

然后是蓝牙部分的设置,蓝牙使用GPIO3_A7控制电源,因此将BT,reset_gpio设置为GPIO3_A7。然后BT,wake_gpio是用于唤醒蓝牙模组的,相当于也是个使能脚,这里使用GPIO3_C0,最后那个是用于蓝牙唤醒CPU的一个中断脚,如果用不到这个功能可以不配置。
AP6256的WiFi/蓝牙驱动在kernel/drivers/net/wireless/rockchip_wlan/rkwifi/bcmdhd目录,需要在menuconfig中打开如下配置

编译之后得到bcmdhd.ko,这个文件在编译系统的时候,会被拷贝到product的vendor目录下面
RK的WiFi/蓝牙支持动态识别模组型号并加载驱动,其原理是通过SDIO的ID来识别不同的WiFi/BT模组,流程是先控制电源脚上电,然后识别ID,根据ID选择vendor目录里面的不同的驱动加载。这个流程的源码在
frameworks/opt/net/wifi/libwifi_hal/rk_wifi_ctrl.cpp
其中的这一段

修改设备树之后重新编译内核,上电的时候可以看到如下打印,

这里就是已经和ap6256模组通讯成功,获取了其MAC地址,如果这里没有识别到MAC地址,则需要检查电源引脚是否配置错误,可以通过
cat /sys/kernel/debug/gpio
命令查看GPIO的电平是否正确
然后在系统里面开启、连接WiFi的方式跟手机上面一样,这里就不过多介绍了。