文章目录
调试的目的
使思源项目的rk3568板子可以识别并挂载sata硬盘,并且可以成功读写。
问题现象
描述问题产生的现象,可以附上关键日志,或截图(如果是日志尽量以文本方式呈现,尽量去除不重要的日志,方便搜索)
板子有个SATA接口,在此接口上插入硬盘时,系统并不能识别到该硬盘,没有出现相应的/dev/sd*分区,并且sata接口旁边的led灯没有亮起。
调试的思路
概要描述需要的关键步骤。
步骤一,查阅数据手册,获取模块信息
步骤二,查阅原理图,确定模块和CPU的对应GPIO
步骤三,修改设备树,添加节点属性
步骤四,修改板级配置文件
步骤五,修改驱动
问题解决方法和过程
步骤一,查阅数据手册,获取模块信息
通过查阅原理图以及实物板,可以板子的硬盘接口为SATA,查阅RK3568相关手册可知其如下特点。
图. 芯片资源
图. DTS 配置
步骤二,查阅原理图,确定模块和CPU的对应GPIO
根据原理图,可知模块对应引脚如下
USB3_OTG0_SSTXP/SATA0_TXP SATA接口
USB3_OTG0_SSTXN/SATA0_TXN SATA接口
USB3_OTG0_SSRXP/SATA0_RXP SATA接口
USB3_OTG0_SSRXN/SATA0_RXN SATA接口
PWM13_M1/SPI3_CS0_M1/SATA0_ACT_LED/UART9_RX_M1/I2S3_SDI_M1/GPIO4_C6_d SATA_ACK_LED 指示灯
图. 芯片引脚
图. CPU引脚
步骤三,修改设备树,添加节点属性
arch/arm64/boot/dts/rockchip/rk3568.dtsi
找到sata0节点,不需要修改,观察其中两个重要属性"compatible"和"phy-names"。compatible 表示其用的是标准的AHCI驱动,phy-names = "sata-phy"表示AHCI驱动会通过这个属性名字找到对应combphy节点。
sata0: sata@fc000000 {
compatible = "snps,dwc-ahci";
reg = <0 0xfc000000 0 0x1000>;
clocks = <&cru ACLK_SATA0>, <&cru CLK_SATA0_PMALIVE>,
<&cru CLK_SATA0_RXOOB>;
clock-names = "sata", "pmalive", "rxoob";
interrupts = <GIC_SPI 94 IRQ_TYPE_LEVEL_HIGH>;
interrupt-names = "hostc";
phys = <&combphy0_us PHY_TYPE_SATA>;
phy-names = "sata-phy";
ports-implemented = <0x1>;
power-domains = <&power RK3568_PD_PIPE>;
status = "disabled";
};
arch/arm64/boot/dts/rockchip/rk3568.dtsi
找到combphy0_us节点,不需要修改,assigned-clock-rates 可选项有:24000000、25000000和100000000。
combphy0_us: phy@fe820000 {
compatible = "rockchip,rk3568-naneng-combphy";
reg = <0x0 0xfe820000 0x0 0x100>;
#phy-cells = <1>;
clocks = <&pmucru CLK_PCIEPHY0_REF>, <&cru PCLK_PIPEPHY0>,
<&cru PCLK_PIPE>;
clock-names = "refclk", "apbclk", "pipe_clk";
assigned-clocks = <&pmucru CLK_PCIEPHY0_REF>;
assigned-clock-rates = <100000000>;
resets = <&cru SRST_P_PIPEPHY0>, <&cru SRST_PIPEPHY0>;
reset-names = "combphy-apb", "combphy";
rockchip,pipe-grf = <&pipegrf>;
rockchip,pipe-phy-grf = <&pipe_phy_grf0>;
status = "disabled";
};
kernel/arch/arm64/boot/dts/rockchip/rk3568-evb.dtsi
添加代码,使能节点,SATA控制器节点和对应的 phy 节点同时使能status属性
&sata0 {
status = "okay";
};
&combphy0_us {
status = "okay";
};
kernel/arch/arm64/boot/dts/rockchip/rk3568-evb.dtsi
找到leds节点,在leds节点中添加hdd_led新子节点,并默认使能"on",如下
leds: leds {
......
hdd_led: hdd {
gpios = <&gpio4 RK_PC6 GPIO_ACTIVE_HIGH>;
default-state = "on";
};
};
如果外接PM芯片扩展SATA口时,可能需要一个GPIO来复位PM芯片,可进行如下配置,不过当前调试的板子并没有应用到此设计,所以不需要,以下操作为可选项。
kernel/arch/arm64/boot/dts/rockchip/rk3568-nvr-demo-v10.dtsi
&combphy1_usq {
pinctrl-names = "default";
pinctrl-0 = <&sata_pm_reset>;
rockchip,dis-u3otg1-port;
status = "okay";
};
&pinctrl {
stata {
sata_pm_reset: sata-pm-reset {
rockchip,pins = <4 RK_PD2 RK_FUNC_GPIO &pcfg_output_high>;
};
};
};
步骤四,配置板级config文件
kernel/arch/arm64/configs/rockchip_linux_defconfig,需要确保如下配置打开,方可正确的使用 SATA相关功能。
CONFIG_ATA=y
CONFIG_SATA_AHCI=y
CONFIG_SATA_AHCI_PLATFORM=y
CONFIG_PHY_ROCKCHIP_NANENG_COMBO_PHY=y
步骤五,修改驱动
drivers/ata/ahci_platform.c,这是AHCI驱动源码,这部分不需要修改。
drivers/ata/Makefile,查阅被编译的源文件,这部分不需要修改。
测试方法
测试方法一,日志分析
dmesg |grep sata
观察板子上,SATA接口旁边的LED,亮起状态。
测试方法二,命令测试
fdisk -l
其他磁盘管理相关命令
lsblk # 查询所有块设备信息,名称|主次设备号|大小|块设备类型|挂载点
cat /sys/block/*/queue/rotational # 区分HDD与SSD,*代表具体块设备,比如sda。打印1则表示磁盘可旋转,可以判断是HDD;打印0则可能是SSD。
cat /sys/block/sda/removable # 区分U盘与HDD/SSD。打印1则表示磁盘可移除,可以判断是U盘;打印0则可能是HDD/SSD。
sudo hdparm -I /dev/sda |grep Model # 查询硬盘的厂商和型号,比如TOSHIBA是东芝,FORESEE是江波龙。
测试方法三,挂载硬盘操作
【查询硬盘和分区详细信息】sudo fdisk -l
【将分区格式化为EXT4格式】mkfs -t ext4 /dev/sda
【挂载硬盘分区到目录】mount /dev/sda /storage
【修改目录权限】chmod 777 /storage
touch /storage/test.log
reboot
cat /storage/test.log
参考内容
调试过程中参考的文章(可以链接方式提供,也可以再次整理),需要重新梳理的一些概念,用到的调试技术。
docs/RK356X/Rockchip_RK356X_Developer_Guide_SATA_CN.pdf