主题中讨论的其他器件:AM3351
工具与软件:
AM335x SDK v9的文档说明了 SPI 从模式受支持且不受支持。 在启用 DMA 的情况下是否支持 SPI 从模式?
不支持的功能
下面列出了 Linux 驱动程序不支持的功能。 请注意、这并不是详尽列表、而是仅考虑 SoC 中 SPI 外设能够实现但 Linux 驱动程序当前不支持的特性。
-
仅在启用 DMA 时支持 SPI 从模式。
-
不支持 SPI 从模式。
在 am33xx-L4.dtsi 中、我们发现 SPI0和 SPI1节点、
target-module@30000 { /* 0x48030000, ap 77 08.0 */ compatible = "ti,sysc-omap2", "ti,sysc"; reg = <0x30000 0x4>, <0x30110 0x4>, <0x30114 0x4>; reg-names = "rev", "sysc", "syss"; ti,sysc-mask = <(SYSC_OMAP2_CLOCKACTIVITY | SYSC_OMAP2_SOFTRESET | SYSC_OMAP2_AUTOIDLE)>; ti,sysc-sidle = <SYSC_IDLE_FORCE>, <SYSC_IDLE_NO>, <SYSC_IDLE_SMART>; ti,syss-mask = <1>; /* Domains (P, C): per_pwrdm, l4ls_clkdm */ clocks = <&l4ls_clkctrl AM3_L4LS_SPI0_CLKCTRL 0>; clock-names = "fck"; #address-cells = <1>; #size-cells = <1>; ranges = <0x0 0x30000 0x1000>; spi0: spi@0 { compatible = "ti,omap4-mcspi"; #address-cells = <1>; #size-cells = <0>; reg = <0x0 0x400>; interrupts = <65>; ti,spi-num-cs = <2>; dmas = <&edma 16 0 &edma 17 0 &edma 18 0 &edma 19 0>; dma-names = "tx0", "rx0", "tx1", "rx1"; status = "disabled"; }; }; target-module@a0000 { /* 0x481a0000, ap 79 24.0 */ compatible = "ti,sysc-omap2", "ti,sysc"; reg = <0xa0000 0x4>, <0xa0110 0x4>, <0xa0114 0x4>; reg-names = "rev", "sysc", "syss"; ti,sysc-mask = <(SYSC_OMAP2_CLOCKACTIVITY | SYSC_OMAP2_SOFTRESET | SYSC_OMAP2_AUTOIDLE)>; ti,sysc-sidle = <SYSC_IDLE_FORCE>, <SYSC_IDLE_NO>, <SYSC_IDLE_SMART>; ti,syss-mask = <1>; /* Domains (P, C): per_pwrdm, l4ls_clkdm */ clocks = <&l4ls_clkctrl AM3_L4LS_SPI1_CLKCTRL 0>; clock-names = "fck"; #address-cells = <1>; #size-cells = <1>; ranges = <0x0 0xa0000 0x1000>; spi1: spi@0 { compatible = "ti,omap4-mcspi"; #address-cells = <1>; #size-cells = <0>; reg = <0x0 0x400>; interrupts = <125>; ti,spi-num-cs = <2>; dmas = <&edma 42 0 &edma 43 0 &edma 44 0 &edma 45 0>; dma-names = "tx0", "rx0", "tx1", "rx1"; status = "disabled"; }; };
假设支持从模式、您是否能够在 启用 DMA 的情况下为 SPI1上的主器件和 SPI0上的从器件提供示例器件树节点? 大多数与 SPI 相关的线程早于 SDK9。
这是迄今为止 DTS 中 SPI0和 SPI1的情况。
&spi0 { status = "okay"; pinctrl-names = "default"; pinctrl-0 = <&spi0_pins>; ti,pindir-d0-out-d1-in = <1>; spislave@0 { /* Define a SPI device at chip select 0 in slave mode */ compatible = "spislave"; /* Use the generic SPI slave-mode driver */ spi-max-frequency = <32000000>; /* Set max SPI clock speed to 16MHz */ spi-cpha; reg = <0>; /* Chip select 0 */ spi-slave; /* Enable slave mode */ }; }; &spi1 { status = "okay"; pinctrl-names = "default"; pinctrl-0 = <&spi1_pins>; spimaster@0 { /* Define a SPI device at chip select 0 */ compatible = "spidev"; /* Use the generic SPI user-mode driver */ spi-max-frequency = <16000000>; /* Set max SPI clock speed to 16MHz */ spi-cpha; reg = <0>; /* Chip select 0 */ };
与 SPI 相关的内核配置包括:
CONFIG_SPI_OMAP24xx=m
CONFIG_SPI_SPIDEV=m
CONFIG_SPI_SLAVE=y
# modprobe spi_omap2_mcspi # modprobe spidev # lsmod Module Size Used by spidev 20480 0 spi_omap2_mcspi 24576 0 omap_sham 28672 0 omap_aes_driver 24576 0 omap_crypto 16384 1 omap_aes_driver crypto_engine 20480 2 omap_aes_driver,omap_sham omap_wdt 16384 0 rtc_omap 20480 1 wkup_m3_ipc 16384 0 wkup_m3_rproc 16384 1