[PATCH v2 0/3] i2c: at91: slave mode support
From: Juergen Fitschen
Date: Thu Nov 09 2017 - 12:21:48 EST
Based on the discussion we had on the i2c-linux list [1], I wrote a patch for
AT91 hardware and tried to fulfill the Linux I2C slave interface description
[2] as good as possible. This enables aforementioned hardware to act as an I2C
slave that can be accessed by a remote I2C master.
I have tested this patchset successfully on an ATSAMA5D27.
^ 3.3V ^ 3.3V
+-----------------------+ | | +-----------------------+
| Slave: ATSAMA5D27 | +-+ +-+ | Master: ATSAMA5D35 |
| with i2c-slave-eeprom | | | 100k | | 100k | with i2cset |
+-------------------+-+-+ +-+ +-+ +-+-+-------------------+
| | | | | |
| +------+---------|---(SDA)---+ |
+------------------+---(SCL)-----+
Schematic: Connection of slave and master with 100kOhm pullup resistors.
On the master the following BASH script has been used to stress the slave.
root@emblinux:~# cat ./stress.sh
#!/bin/bash
I=0
while true
do
if i2cset -y -r 1 0x64 0 $I w | grep mismatch
then
echo "$(date): Error in transmission ${I}"
fi
((I++))
if [ $I -eq 65536 ]
then
I=0
echo "$(date): Sent 65536 transmissions"
fi
done
After running the script for some time I had the following output. To me this
looks promising :)
root@emblinux:~# ./stress.sh
Thu Nov 9 13:58:45 CTE 2017: Sent 65536 transmissions
Thu Nov 9 14:35:20 CTE 2017: Sent 65536 transmissions
Thu Nov 9 15:12:11 CTE 2017: Sent 65536 transmissions
Thu Nov 9 15:49:04 CTE 2017: Sent 65536 transmissions
Thu Nov 9 16:26:00 CTE 2017: Sent 65536 transmissions
Thu Nov 9 17:03:07 UTC 2017: Sent 65536 transmissions
Thu Nov 9 17:40:15 UTC 2017: Sent 65536 transmissions
If you have some hardware with an at91-i2c interface included at hand, I really
would appreciate if you can run the test script on your hardware and test this
driver.
Best regards
Juergen
Changes in v2:
- Implemented all suggestions made by Ludovic. (Thank you!)
- Reworked the IRQ handler completely. Have a look in patch 3 fort further
details.
[1] https://marc.info/?t=150824004800001&r=1&w=1
[2] https://www.kernel.org/doc/Documentation/i2c/slave-interface
Juergen Fitschen (3):
i2c: at91: segregate master mode specific code from probe and init
func
i2c: at91: split driver into core and master file
i2c: at91: added slave mode support
Documentation/devicetree/bindings/i2c/i2c-at91.txt | 14 +
MAINTAINERS | 3 +-
drivers/i2c/busses/Kconfig | 10 +
drivers/i2c/busses/Makefile | 4 +
drivers/i2c/busses/i2c-at91-core.c | 390 ++++++
drivers/i2c/busses/i2c-at91-master.c | 806 +++++++++++++
drivers/i2c/busses/i2c-at91-slave.c | 216 ++++
drivers/i2c/busses/i2c-at91.c | 1243 --------------------
drivers/i2c/busses/i2c-at91.h | 191 +++
9 files changed, 1633 insertions(+), 1244 deletions(-)
create mode 100644 drivers/i2c/busses/i2c-at91-core.c
create mode 100644 drivers/i2c/busses/i2c-at91-master.c
create mode 100644 drivers/i2c/busses/i2c-at91-slave.c
delete mode 100644 drivers/i2c/busses/i2c-at91.c
create mode 100644 drivers/i2c/busses/i2c-at91.h
--
2.7.4