Linux 内核看不到我的 at91sam9g20 板上的所有组件
Linux kernel does not see all components on my at91sam9g20 board
我正在使用 Stamp9g20 embedded chip. It is based on the Atmel at91sam9g20 platform. For a client I need to upgrade the kernel to a newer version. After a bit of research, I landed on the Linux4SAM 页面及其附加的 yocto 层,并配有 4.14 内核!
然而,当我编译那个内核时,我没有看到我所有的设备,例如,我可以写入 NAND 内存并挂载 USB 设备,但是我看不到也没有挂载任何 mmc/mci 设备。我已经尝试检查 Stamp9g20 与 AT91SAM9G20EK 的真正区别,但我无法在那里找到答案的明确线索。
Linux4SAM 存储库支持略有不同的 AT91SAM9 系列版本,但我使用 at91sam9g20ek.dts 作为开发板的输入使其适用于 4.14 内核。必须将我的机器添加到兼容机器列表中,因此它也将为 9g20 版本编译。
COMPATIBLE_MACHINE += 'at91sam9g20ek'
我的 machine.conf 看起来像:
#@Name: ATMEL AT91SAM9G20EK
#@DESCRIPTION: Machine configuration for Atmel's evaluation board
#
# define SOC_FAMILY (we are the family of ...)
SOC_FAMILY = "atsam9"
# Add arm926ejs to the DEFAULTTUNE, so it will be selected in our environment
DEFAULTTUNE = "arm926ejs"
# http://lists.openembedded.org/pipermail/openembedded-core/2019-January/277527.html
#TUNE_CCARGS .= "${@bb.utils.contains('TUNE_FEATURES', 'armv5', ' -march=armv5t${ARMPKGSFX_DSP}', '', d)}"
TUNE_CCARGS = "${@bb.utils.contains('TUNE_FEATURES', 'armv5', ' -march=armv5t${ARMPKGSFX_DSP}', '', d)}"
# We rely on the generic meta-atmel layer
require conf/machine/include/at91sam9.inc
MACHINE_FEATURES = "apm ext2 ext3 ext4 usbhost usbgadget vfat jffs2"
# This device tree is available in the kernel
KERNEL_DEVICETREE = " \
at91sam9g20ek.dtb \
"
# Create filesystems tar.gz and jffs2
IMAGE_FSTYPES += " tar.gz jffs2 tar"
# UNTESTED IMAGES (both bootstrap and uboot)
UBOOT_MACHINE ?= "at91sam9g20ek_nandflash_defconfig"
UBOOT_ENTRYPOINT = "0x20008000"
UBOOT_LOADADDRESS = "0x20008000"
AT91BOOTSTRAP_MACHINE ?= "at91sam9g20ek"
当内核启动时,它显示它在地址 0xffff8000 上注册了一个设备驱动程序,但它没有看到块设备。
bus: 'mmc': add driver mmcblk
bus: 'sdio': add driver sdio_uart
bus: 'platform': add driver atmel_mci
bus: 'platform': driver_probe_device: matched device fffa8000.mmc with driver atmel_mci
bus: 'platform': really_probe: probing driver atmel_mci with device fffa8000.mmc
atmel_mci fffa8000.mmc: no init pinctrl state
atmel_mci fffa8000.mmc: version: 0x210
atmel_mci fffa8000.mmc: using PDC
device: 'mmc0': device_add
atmel_mci fffa8000.mmc: Atmel MCI controller at 0xfffa8000 irq 30, 1 slots
driver: 'atmel_mci': driver_bound: bound to device 'fffa8000.mmc'
bus: 'platform': really_probe: bound device fffa8000.mmc to driver atmel_mci
我已经用 2.6.x 版本试过这个板,它按预期工作。
如何让块设备mmcblk在系统中可用?我是否需要更改 .dts(目前我使用 at91sam9g20ek.dts 作为模板,对 NAND 内存进行了微小的更改)。或者我该怎么做才能获得有关内核为何不与 mmc 设备交互的更多信息?
此外,如果我比较 dts 结构之前的源代码,我没有发现代码的 mcc 部分有显着差异:
https://elixir.bootlin.com/linux/v3.6.9/source/arch/arm/mach-at91/board-sam9g20ek.c
https://elixir.bootlin.com/linux/v3.6.9/source/arch/arm/mach-at91/board-stamp9g20.c
我发现的唯一区别,
at91sam9g20ek 主板:
.slot_b = 1, /* Only one slot so use slot B */
stamp9g20板:
.slot_b = 0,
所以我尝试将 dts 中的 reg<> 属性 更改为 1,但无济于事...
找到了!我所要做的就是将 dts 中的 mmc 插槽(原为 1)更改为插槽 0:
--- a/arch/arm/boot/dts/at91sam9g20ek_common.dtsi
+++ b/arch/arm/boot/dts/at91sam9g20ek_common.dtsi
@@ -39,8 +39,8 @@
};
- mmc0_slot1 {
- pinctrl_board_mmc0_slot1: mmc0_slot1-board {
+ mmc0_slot0 {
+ pinctrl_board_mmc0_slot0: mmc0_slot0-board {
atmel,pins =
<AT91_PIOC 9 AT91_PERIPH_GPIO AT91_PINCTRL_PULL_UP_DEGLITCH>; /* PC9 gpio CD pin pull up and deglitch */
};
@@ -90,15 +90,14 @@
mmc0: mmc@fffa8000 {
pinctrl-0 = <
- &pinctrl_board_mmc0_slot1
+ &pinctrl_board_mmc0_slot0
&pinctrl_mmc0_clk
- &pinctrl_mmc0_slot1_cmd_dat0
- &pinctrl_mmc0_slot1_dat1_3>;
+ &pinctrl_mmc0_slot0_cmd_dat0
+ &pinctrl_mmc0_slot0_dat1_3>;
status = "okay";
- slot@1 {
- reg = <1>;
+ slot@0 {
+ reg = <0>;
bus-width = <4>;
- cd-gpios = <&pioC 9 GPIO_ACTIVE_HIGH>;
};
};
我正在使用 Stamp9g20 embedded chip. It is based on the Atmel at91sam9g20 platform. For a client I need to upgrade the kernel to a newer version. After a bit of research, I landed on the Linux4SAM 页面及其附加的 yocto 层,并配有 4.14 内核!
然而,当我编译那个内核时,我没有看到我所有的设备,例如,我可以写入 NAND 内存并挂载 USB 设备,但是我看不到也没有挂载任何 mmc/mci 设备。我已经尝试检查 Stamp9g20 与 AT91SAM9G20EK 的真正区别,但我无法在那里找到答案的明确线索。
Linux4SAM 存储库支持略有不同的 AT91SAM9 系列版本,但我使用 at91sam9g20ek.dts 作为开发板的输入使其适用于 4.14 内核。必须将我的机器添加到兼容机器列表中,因此它也将为 9g20 版本编译。
COMPATIBLE_MACHINE += 'at91sam9g20ek'
我的 machine.conf 看起来像:
#@Name: ATMEL AT91SAM9G20EK
#@DESCRIPTION: Machine configuration for Atmel's evaluation board
#
# define SOC_FAMILY (we are the family of ...)
SOC_FAMILY = "atsam9"
# Add arm926ejs to the DEFAULTTUNE, so it will be selected in our environment
DEFAULTTUNE = "arm926ejs"
# http://lists.openembedded.org/pipermail/openembedded-core/2019-January/277527.html
#TUNE_CCARGS .= "${@bb.utils.contains('TUNE_FEATURES', 'armv5', ' -march=armv5t${ARMPKGSFX_DSP}', '', d)}"
TUNE_CCARGS = "${@bb.utils.contains('TUNE_FEATURES', 'armv5', ' -march=armv5t${ARMPKGSFX_DSP}', '', d)}"
# We rely on the generic meta-atmel layer
require conf/machine/include/at91sam9.inc
MACHINE_FEATURES = "apm ext2 ext3 ext4 usbhost usbgadget vfat jffs2"
# This device tree is available in the kernel
KERNEL_DEVICETREE = " \
at91sam9g20ek.dtb \
"
# Create filesystems tar.gz and jffs2
IMAGE_FSTYPES += " tar.gz jffs2 tar"
# UNTESTED IMAGES (both bootstrap and uboot)
UBOOT_MACHINE ?= "at91sam9g20ek_nandflash_defconfig"
UBOOT_ENTRYPOINT = "0x20008000"
UBOOT_LOADADDRESS = "0x20008000"
AT91BOOTSTRAP_MACHINE ?= "at91sam9g20ek"
当内核启动时,它显示它在地址 0xffff8000 上注册了一个设备驱动程序,但它没有看到块设备。
bus: 'mmc': add driver mmcblk
bus: 'sdio': add driver sdio_uart
bus: 'platform': add driver atmel_mci
bus: 'platform': driver_probe_device: matched device fffa8000.mmc with driver atmel_mci
bus: 'platform': really_probe: probing driver atmel_mci with device fffa8000.mmc
atmel_mci fffa8000.mmc: no init pinctrl state
atmel_mci fffa8000.mmc: version: 0x210
atmel_mci fffa8000.mmc: using PDC
device: 'mmc0': device_add
atmel_mci fffa8000.mmc: Atmel MCI controller at 0xfffa8000 irq 30, 1 slots
driver: 'atmel_mci': driver_bound: bound to device 'fffa8000.mmc'
bus: 'platform': really_probe: bound device fffa8000.mmc to driver atmel_mci
我已经用 2.6.x 版本试过这个板,它按预期工作。
如何让块设备mmcblk在系统中可用?我是否需要更改 .dts(目前我使用 at91sam9g20ek.dts 作为模板,对 NAND 内存进行了微小的更改)。或者我该怎么做才能获得有关内核为何不与 mmc 设备交互的更多信息?
此外,如果我比较 dts 结构之前的源代码,我没有发现代码的 mcc 部分有显着差异: https://elixir.bootlin.com/linux/v3.6.9/source/arch/arm/mach-at91/board-sam9g20ek.c https://elixir.bootlin.com/linux/v3.6.9/source/arch/arm/mach-at91/board-stamp9g20.c
我发现的唯一区别, at91sam9g20ek 主板:
.slot_b = 1, /* Only one slot so use slot B */
stamp9g20板:
.slot_b = 0,
所以我尝试将 dts 中的 reg<> 属性 更改为 1,但无济于事...
找到了!我所要做的就是将 dts 中的 mmc 插槽(原为 1)更改为插槽 0:
--- a/arch/arm/boot/dts/at91sam9g20ek_common.dtsi
+++ b/arch/arm/boot/dts/at91sam9g20ek_common.dtsi
@@ -39,8 +39,8 @@
};
- mmc0_slot1 {
- pinctrl_board_mmc0_slot1: mmc0_slot1-board {
+ mmc0_slot0 {
+ pinctrl_board_mmc0_slot0: mmc0_slot0-board {
atmel,pins =
<AT91_PIOC 9 AT91_PERIPH_GPIO AT91_PINCTRL_PULL_UP_DEGLITCH>; /* PC9 gpio CD pin pull up and deglitch */
};
@@ -90,15 +90,14 @@
mmc0: mmc@fffa8000 {
pinctrl-0 = <
- &pinctrl_board_mmc0_slot1
+ &pinctrl_board_mmc0_slot0
&pinctrl_mmc0_clk
- &pinctrl_mmc0_slot1_cmd_dat0
- &pinctrl_mmc0_slot1_dat1_3>;
+ &pinctrl_mmc0_slot0_cmd_dat0
+ &pinctrl_mmc0_slot0_dat1_3>;
status = "okay";
- slot@1 {
- reg = <1>;
+ slot@0 {
+ reg = <0>;
bus-width = <4>;
- cd-gpios = <&pioC 9 GPIO_ACTIVE_HIGH>;
};
};