Jump to content

    
Sign in to follow this  
Aleksei_Rostov

ZynqMP + IIC IP core помогите разобраться

Recommended Posts

Добрый день! подскажите пожалуйста какие есть варианты работы с i2c устройствами для ZYnqMP из user space и как данные варианты реализовать.

Как понимаю, есть два встроенных контроллера i2c и есть IP core IIC.

Работать можно через open/close/ioctl/write/read следующим образом:

1. Написать свой kernel module.

2. Использовать готовый драйвер, написанный под конкретное устройство (в DT указывается типа в строке compatible = "at,24c08").

3. Использовать встроенный драйвер от Xilinx (В конфиге ядра CONFIG_I2C_XILINX=y).

Я понимаю как написать свой модуль, как реализовать приложение в user space.

Не понятно, как правильно прописывать устройства в device tree, например если использовать встроенный драйвер от XIlinx?

Как использовать один i2c контроллер общей шиной для нескольких слейвов и вывести пины для каждого слейва?

Буду признателен за любые советы)

 

Вот что  у меня получилось. Есть i2c для EEPROM и добавил IIC IP core для какого либо слейва.

i2c0: i2c@ff020000 {
   compatible = "cdns,i2c-r1p14", "cdns,i2c-r1p10";
   status = "disabled";
   interrupt-parent = <&gic>;
   interrupts = <0 17 4>;
   reg = <0x0 0xff020000 0x0 0x1000>;
   #address-cells = <1>;
   #size-cells = <0>;
   power-domains = <&zynqmp_firmware 37>;
  };

  i2c1: i2c@ff030000 {
   compatible = "cdns,i2c-r1p14", "cdns,i2c-r1p10";
   status = "disabled";
   interrupt-parent = <&gic>;
   interrupts = <0 18 4>;
   reg = <0x0 0xff030000 0x0 0x1000>;
   #address-cells = <1>;
   #size-cells = <0>;
   power-domains = <&zynqmp_firmware 38>;
  };

axi_iic_0: i2c@80000000 {
   #address-cells = <1>;
   #size-cells = <0>;
   clock-names = "s_axi_aclk";
   clocks = <&zynqmp_clk 71>;
   compatible = "xlnx,axi-iic-2.0", "xlnx,xps-iic-2.00.a";
   interrupt-names = "iic2intc_irpt";
   interrupt-parent = <&gic>;
   interrupts = <0 89 4>;
   reg = <0x0 0x80000000 0x0 0x1000>;
  };

&i2c0 {
 clock-frequency = <400000>;
 status = "okay";
};

aliases {
		ethernet0 = &gem3;
		i2c1 = &axi_iic_0;
		i2c0 = &i2c0;
		serial0 = &uart0;
		spi0 = &qspi;
	};

После старта 

# i2cdetect -l
i2c-1   i2c             xiic-i2c                                I2C adapter
i2c-0   i2c             Cadence I2C at ff020000                 I2C adapter

Лог загрузки 

[   12.998730] usbcore: registered new interface driver usb-storage
[   12.999247] rtc_zynqmp ffa60000.rtc: registered as rtc0
[   12.999298] i2c /dev entries driver
[   13.000721] usbcore: registered new interface driver uvcvideo

Через утилиты i2cget / i2cset без проблем работаю с eeprom (i2c-0)

# i2cdetect -y 0 -r
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f
00:          -- -- -- -- -- -- -- -- -- -- -- -- --
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
50: 50 -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
70: 70 -- -- -- -- -- -- --
# i2cset -y 0 0x50 0x00 0x69
# i2cget -y 0 0x50 0x00
0x69

c iic так не получается

# i2cdetect -y 1 -r
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f
00:          -- -- -- -- -- -- -- -- -- -- -- -- --
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
70: -- -- -- -- -- -- -- --
# i2cset -y 1 0x48 0x00 0x69
# i2cget -y 1 0x48 0x00
i2cget: read failed: Input/output error

 

 

 

Share this post


Link to post
Share on other sites
Guest
This topic is now closed to further replies.
Sign in to follow this