HI:
I use imx6ul ,linux kenerl version branch imx_4.1.15_1.0.0_ga, I refrence branch imx_4.14.98_2.0.0_ga add spi slave mode to imx_4.1.15_1.0.0_ga, and spi slave mode is proper functioning, but it affects ecspi flash and other pad ,such as PAD_GPIO1_IO00,details are as follows:
1 . ecspi flash problem:
my ecspi flash config
&ecspi1 {
fsl,spi-num-chipselects = <1>;
cs-gpios = <&gpio4 26 0>;
pinctrl-names = "default";
pinctrl-0 = <&pinctrl_ecspi1 &pinctrl_ecspi1_cs>;
status = "okay"; /* pin conflict with WEIM NOR */
flash: m25p80@0 {
#address-cells = <1>;
#size-cells = <1>;
compatible = "micron,n25q128a13";
spi-max-frequency = <40000000>;
reg = <0>;
};
};
pinctrl_ecspi1: ecspi1grp {
fsl,pins = <
MX6UL_PAD_CSI_DATA04__ECSPI1_SCLK 0x1b0b0
MX6UL_PAD_CSI_DATA06__ECSPI1_MOSI 0x1b0b0
MX6UL_PAD_CSI_DATA07__ECSPI1_MISO 0x1b0b0
>;
};
pinctrl_ecspi1_cs: ecspi1cs {
fsl,pins = <
MX6UL_PAD_CSI_DATA05__GPIO4_IO26 0x1b0b0
>;
};
and ecspi3 slave config
&ecspi3 {
#address-cells = <1>;
#size-cells = <0>;
pinctrl-names = "default";
pinctrl-0 = <&pinctrl_ecspi3>;
status = "okay";
spi-slave;
spidev0: spi@0 {
reg = <0>;
compatible = "rohm,dh2228fv";
spi-max-frequency = <20000000>;
};
};
pinctrl_ecspi3: ecspi3grp {
fsl,pins = <
MX6UL_PAD_NAND_CE0_B__ECSPI3_SCLK 0x5011 //0x70a1
MX6UL_PAD_NAND_CE1_B__ECSPI3_MOSI 0x5011 //0x70a1
MX6UL_PAD_NAND_CLE__ECSPI3_MISO 0x5011 //0x70a1
MX6UL_PAD_NAND_RE_B__ECSPI3_SS2 0x5011 //0x70a1
SS>;
};
Starting kernel ...
Booting Linux on physical CPU 0x0
Linux version 4.1.15+ (lxh@lxh) (gcc version 5.2.0 (GCC) ) #12 SMP PREEMPT Wed Jun 5 09:29:05 CST 2019
CPU: ARMv7 Processor [410fc075] revision 5 (ARMv7), cr=10c53c7d
CPU: PIPT / VIPT nonaliasing data cache, VIPT aliasing instruction cache
Machine model: Freescale i.MX6 UltraLite 14x14 EVK Board
Reserved memory: created CMA memory pool at 0x8c000000, size 320 MiB
Reserved memory: initialized node linux,cma, compatible id shared-dma-pool
Memory policy: Data cache writealloc
PERCPU: Embedded 12 pages/cpu @8bb2f000 s16704 r8192 d24256 u49152
Built 1 zonelists in Zone order, mobility grouping on. Total pages: 130048
Kernel command line: console=ttymxc1,115200 mtdparts=spi0.0:512k(uboot),256k(env),256k(script),4m(kernel),256k(dtb),3840k(rootfs),2m(config),2m(statistics),-(user)
PID hash table entries: 2048 (order: 1, 8192 bytes)
Dentry cache hash table entries: 65536 (order: 6, 262144 bytes)
Inode-cache hash table entries: 32768 (order: 5, 131072 bytes)
Memory: 181204K/524288K available (4672K kernel code, 228K rwdata, 1660K rodata, 320K init, 400K bss, 15404K reserved, 327680K cma-reserved, 0K highmem)
Virtual kernel memory layout:
vector : 0xffff0000 - 0xffff1000 ( 4 kB)
fixmap : 0xffc00000 - 0xfff00000 (3072 kB)
vmalloc : 0xa0800000 - 0xff000000 (1512 MB)
lowmem : 0x80000000 - 0xa0000000 ( 512 MB)
pkmap : 0x7fe00000 - 0x80000000 ( 2 MB)
modules : 0x7f000000 - 0x7fe00000 ( 14 MB)
.text : 0x80008000 - 0x80637594 (6334 kB)
.init : 0x80638000 - 0x80688000 ( 320 kB)
.data : 0x80688000 - 0x806c1360 ( 229 kB)
.bss : 0x806c4000 - 0x807281e8 ( 401 kB)
SLUB: HWalign=64, Order=0-3, MinObjects=0, CPUs=1, Nodes=1
Preemptible hierarchical RCU implementation.
Additional per-CPU info printed with stalls.
RCU restricting CPUs from NR_CPUS=4 to nr_cpu_ids=1.
RCU: Adjusting geometry for rcu_fanout_leaf=16, nr_cpu_ids=1
NR_IRQS:16 nr_irqs:16 16
mxc_clocksource_init 24000000
Switching to timer-based delay loop, resolution 41ns
sched_clock: 32 bits at 24MHz, resolution 41ns, wraps every 89478484971ns
clocksource mxc_timer1: mask: 0xffffffff max_cycles: 0xffffffff, max_idle_ns: 79635851949 ns
Console: colour dummy device 80x30
Calibrating delay loop (skipped), value calculated using timer frequency.. 48.00 BogoMIPS (lpj=240000)
pid_max: default: 32768 minimum: 301
Mount-cache hash table entries: 1024 (order: 0, 4096 bytes)
Mountpoint-cache hash table entries: 1024 (order: 0, 4096 bytes)
CPU: Testing write buffer coherency: ok
/cpus/cpu@0 missing clock-frequency property
CPU0: thread -1, cpu 0, socket 0, mpidr 80000000
Setting up static identity map for 0x80008280 - 0x800082d8
Brought up 1 CPUs
SMP: Total of 1 processors activated (48.00 BogoMIPS).
CPU: All CPU(s) started in SVC mode.
devtmpfs: initialized
VFP support v0.3: implementor 41 architecture 2 part 30 variant 7 rev 5
clocksource jiffies: mask: 0xffffffff max_cycles: 0xffffffff, max_idle_ns: 19112604462750000 ns
pinctrl core: initialized pinctrl subsystem
NET: Registered protocol family 16
DMA: preallocated 256 KiB pool for atomic coherent allocations
cpuidle: using governor ladder
cpuidle: using governor menu
hw-breakpoint: found 5 (+1 reserved) breakpoint and 4 watchpoint registers.
hw-breakpoint: maximum watchpoint size is 8 bytes.
imx6ul-pinctrl 20e0000.iomuxc: initialized IMX pinctrl driver
mxs-dma 1804000.dma-apbh: initialized
SCSI subsystem initialized
usbcore: registered new interface driver usbfs
usbcore: registered new interface driver hub
usbcore: registered new device driver usb
pps_core: LinuxPPS API ver. 1 registered
pps_core: Software ver. 5.3.6 - Copyright 2005-2007 Rodolfo Giometti <giometti@linux.it>
PTP clock support registered
Switched to clocksource mxc_timer1
NET: Registered protocol family 2
TCP established hash table entries: 4096 (order: 2, 16384 bytes)
TCP bind hash table entries: 4096 (order: 3, 32768 bytes)
TCP: Hash tables configured (established 4096 bind 4096)
UDP hash table entries: 256 (order: 1, 8192 bytes)
UDP-Lite hash table entries: 256 (order: 1, 8192 bytes)
NET: Registered protocol family 1
RPC: Registered named UNIX socket transport module.
RPC: Registered udp transport module.
RPC: Registered tcp transport module.
RPC: Registered tcp NFSv4.1 backchannel transport module.
Trying to unpack rootfs image as initramfs...
Freeing initrd memory: 2724K (83800000 - 83aa9000)
imx rpmsg driver is registered.
Bus freq driver module loaded
futex hash table entries: 256 (order: 2, 16384 bytes)
VFS: Disk quotas dquot_6.6.0
VFS: Dquot-cache hash table entries: 1024 (order 0, 4096 bytes)
NFS: Registering the id_resolver key type
Key type id_resolver registered
Key type id_legacy registered
ntfs: driver 2.1.32 [Flags: R/O].
jffs2: version 2.2. (NAND) ? 2001-2006 Red Hat, Inc.
fuse init (API version 7.23)
io scheduler noop registered (default)
imx-weim 21b8000.weim: Driver registered.
imx-sdma 20ec000.sdma: no event needs to be remapped
imx-sdma 20ec000.sdma: loaded firmware 3.3
imx-sdma 20ec000.sdma: initialized
2020000.serial: ttymxc0 at MMIO 0x2020000 (irq = 22, base_baud = 5000000) is a IMX
21e8000.serial: ttymxc1 at MMIO 0x21e8000 (irq = 224, base_baud = 5000000) is a IMX
console [ttymxc1] enabled
imx sema4 driver is registered.
brd: module loaded
loop: module loaded
m25p80 spi0.0: n25q128a13 (16384 Kbytes)
9 cmdlinepart partitions found on MTD device spi0.0
Creating 9 MTD partitions on "spi0.0":
0x000000000000-0x000000080000 : "uboot"
0x000000080000-0x0000000c0000 : "env"
0x0000000c0000-0x000000100000 : "script"
0x000000100000-0x000000500000 : "kernel"
0x000000500000-0x000000540000 : "dtb"
0x000000540000-0x000000900000 : "rootfs"
0x000000900000-0x000000b00000 : "config"
0x000000b00000-0x000000d00000 : "statistics"
0x000000d00000-0x000001000000 : "user"
spi_imx 2008000.ecspi: probed
spi_slave spi2: /soc/aips-bus@02000000/spba-bus@02000000/ecspi@02010000/spi@0 is not called 'slave'
spi_slave spi2: Failed to create SPI device for /soc/aips-bus@02000000/spba-bus@02000000/ecspi@02010000/spi@0
spi_imx 2010000.ecspi: probed
spi_imx 2014000.ecspi: probed
20b4000.ethernet supply phy not found, using dummy regulator
pps pps0: new PPS source ptp0
fec 20b4000.ethernet (unnamed net_device) (uninitialized): Invalid MAC address: 00:00:00:00:00:00
fec 20b4000.ethernet (unnamed net_device) (uninitialized): Using random MAC address: e6:83:65:7b:d8:9a
libphy: fec_enet_mii_bus: probed
fec 20b4000.ethernet eth0: registered PHC device 0
ehci_hcd: USB 2.0 'Enhanced' Host Controller (EHCI) Driver
ehci-mxc: Freescale On-Chip EHCI Host driver
usbcore: registered new interface driver cdc_acm
cdc_acm: USB Abstract Control Model driver for USB modems and ISDN adapters
usbcore: registered new interface driver usblp
usbcore: registered new interface driver usb-storage
usbcore: registered new interface driver usbserial
usbcore: registered new interface driver usbserial_generic
usbserial: USB Serial support registered for generic
usbcore: registered new interface driver ftdi_sio
usbserial: USB Serial support registered for FTDI USB Serial Device
usbcore: registered new interface driver pl2303
usbserial: USB Serial support registered for pl2303
usbcore: registered new interface driver usb_ehset_test
2184800.usbmisc supply vbus-wakeup not found, using dummy regulator
2184000.usb supply vbus not found, using dummy regulator
2184200.usb supply vbus not found, using dummy regulator
ci_hdrc ci_hdrc.1: EHCI Host Controller
ci_hdrc ci_hdrc.1: new USB bus registered, assigned bus number 1
ci_hdrc ci_hdrc.1: USB 2.0 started, EHCI 1.00
hub 1-0:1.0: USB hub found
hub 1-0:1.0: 1 port detected
input: 20cc000.snvs:snvs-powerkey as /devices/platform/soc/2000000.aips-bus/20cc000.snvs/20cc000.snvs:snvs-powerkey/input/input0
snvs_rtc 20cc000.snvs:snvs-rtc-lp: rtc core: registered 20cc000.snvs:snvs-r as rtc0
i2c /dev entries driver
imx2-wdt 20bc000.wdog: use WDOG_B to reboot.
imx2-wdt 20bc000.wdog: timeout 60 sec (nowayout=0)
sdhci: Secure Digital Host Controller Interface driver
sdhci: Copyright(c) Pierre Ossman
sdhci-pltfm: SDHCI platform and OF driver helper
NET: Registered protocol family 17
Key type dns_resolver registered
input: gpio_keys as /devices/platform/gpio_keys/input/input1
snvs_rtc 20cc000.snvs:snvs-rtc-lp: setting system clock to 1970-01-01 00:00:00 UTC (0)
gpio_dvfs: disabling
usb_otg2_vbus: disabling
Freeing unused kernel memory: 320K (80638000 - 80688000)
fec 20b4000.ethernet eth0: Freescale FEC PHY driver [Micrel KSZ8081 or KSZ8091] (mii_bus:phy_addr=20b4000.ethernet:01, irq=-1)
spi_master spi0: I/O Error in DMA RX
spi_master spi0: failed to transfer one message from queue
mount: mounting /dev/mtdblock6 on /home/config/ failed: Input/output error
Please press Enter to activate this console. random: nonblocking pool is initialized
root@root:/#
2.then I use spi_slave
root@root:/# echo spidev > /sys/class/spi_slave/spi2/slave
i use MX6UL_PAD_GPIO1_IO00 as GPIO input, is pulled to high level.
MX6UL_PAD_GPIO1_IO00__GPIO1_IO00 0x17059 //0xb0 //0x000010B0
and I use imx_4.14.98_2.0.0_ga kernel is the same phenomenon
The patch is available at:
Basically, NXP kernel 4.1 does not support SPI slave mode. Not even NXP 4.14 supports it.
Only kernel 4.15 and 4.16 from mainline supports it.
In order to use SPI slave in these kernels the "spi-slave" property needs to be passed in the devicetree as explained at:
Dear jimmychan:
我也有类似需求,我用IMX6ULL ecspi2 ,想配置成SPI-SLAVE模式,现在我同步了几个基线,L4.14.98和imx_4.19.35_1.0.0。
按照您说的,L4.14.98也不支持,仅L4.15以后的基线才支持。但是您们的另外一个技术支持igor的意思好像是L4.14.98就支持了? 从您给到的Patch来看,L4.14.98已经包含在了L4.14.98的基线中。
另外,最重要的一点是,好像这两个基线spidev.c都没修改,我在DT文件中添加了SPI-SLAVE,用户空间中没有对应的设备节点出来。是我配置的不对吗?
&ecspi2 {
fsl,spi-num-chipselects = <1>;
pinctrl-names = "default";
pinctrl-0 = <&pinctrl_ecspi2>;
spi-slave;
status = "okay";
spidev@1 {
compatible = "spidev";
spi-max-frequency = <20000000>;
reg = <0>;
};
};
Kernel的引导log如下:
spi_slave spi1: /soc/aips-bus@2000000/spba-bus@2000000/ecspi@200c000/spidev@1 is not called 'slave'
spi_slave spi1: Failed to create SPI device for /soc/aips-bus@2000000/spba-bus@2000000/ecspi@200c000/spidev@1
spi_imx 200c000.ecspi: probed
如果我注释掉
spidev@1 {
compatible = "spidev";
spi-max-frequency = <20000000>;
reg = <0>;
};
这几行,则不会报错。但是,dev目录下依旧没有spidev节点出来。另外两个master设备能够正常在dev中显示。
所以,我现在的问题是,如何使能SPI-SLAVE,并且在dev中显示slave节点?以便我用户空间的程序调用来接收数据?