Перейти к содержанию
    

Совместимость с Orange Pi

On 9/20/2022 at 9:37 AM, aaarrr said:

Вот не уверен, что это правильно.

попробовал param_spidev_spi_bus=1

то же самое.

пишут что надо =0

Изменено пользователем jenya7

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

37 minutes ago, jenya7 said:

пишут что надо =0

Мало ли, что пишут. Разбираться - проверить содержимое оверлея, сопоставить со схемой и т.д.

И лучше без "либ", spidev можно замечательно окучить напрямую.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

On 9/20/2022 at 10:33 AM, aaarrr said:

Мало ли, что пишут. Разбираться - проверить содержимое оверлея, сопоставить со схемой и т.д.

а как проверить содержимое?

On 9/20/2022 at 10:33 AM, aaarrr said:

И лучше без "либ", spidev можно замечательно окучить напрямую.

без либ

static const char *device = "/dev/spidev0.0";

int SPI_Setup(int speed)
{
    int ret = 0;
	int fd;

	fd = open(device, O_RDWR);
	if (fd < 0)
		printf("can't open device\n");

	ret = ioctl(fd, SPI_IOC_WR_MODE, 0);
	if (ret == -1)
		printf("can't set spi mode");

	ret = ioctl(fd, SPI_IOC_WR_BITS_PER_WORD,8);
	if (ret == -1)
		printf("can't set bits per word");
  
	ret = ioctl(fd, SPI_IOC_WR_MAX_SPEED_HZ, &speed);
	if (ret == -1)
		printf("can't set max speed hz");

	return fd;
}
            

fd получает какие то странные дескрипторы (18, 28) и ret возвращает -1.

 

я добавил status в трансфер

void IO_BOARD_Xfer(int spi_handle, char *tx_buf, char *rx_buf, int count)
{
    int status = lgSpiXfer(spi_handle, tx_buf, rx_buf, count);
}

он возвращает количесиво посланных байт. похоже либа отрабатывает как надо. кстати его конфигурация мало чем отличается от нативной

int lgSpiOpen(int spiDev, int spiChan, int baud, int spiFlags)
{
   int handle;
   lgSpiObj_p spi;
   int fd;
   char  spiMode;
   char  spiBits  = 8;
   char dev[128];
   
   LG_DBG(LG_DEBUG_TRACE, "spiDev=%d spiChan=%d baud=%d spiFlags=0x%X",
      spiDev, spiChan, baud, spiFlags);

   spiMode  = spiFlags & 3;
   spiBits  = 8;

   sprintf(dev, "/dev/spidev%d.%d", spiDev, spiChan);

   if ((fd = open(dev, O_RDWR)) < 0)
   {
      return LG_SPI_OPEN_FAILED;
   }

   if (ioctl(fd, SPI_IOC_WR_MODE, &spiMode) < 0)
   {
      close(fd);
      return LG_SPI_IOCTL_FAILED;
   }

   if (ioctl(fd, SPI_IOC_WR_BITS_PER_WORD, &spiBits) < 0)
   {
      close(fd);
      return LG_SPI_IOCTL_FAILED;
   }

   if (ioctl(fd, SPI_IOC_WR_MAX_SPEED_HZ, &baud) < 0)
   {
      close(fd);
      return LG_SPI_IOCTL_FAILED;
   }

   handle = lgHdlAlloc(
      LG_HDL_TYPE_SPI, sizeof(lgSpiObj_t), (void **)&spi, _lgSpiClose);

   if (handle < 0)
   {
      PARAM_ERROR(LG_NO_HANDLE, "no free handles");
   }

   spi->fd = fd;
   spi->speed = baud;
   spi->flags = spiFlags;

   return handle;
}

 

Изменено пользователем jenya7

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

у меня в boot/overlay есть sun50i-h5-spi-spidev.dtbo но я не могу его открыть. нужно декомпилировать. как это сделать?

Изменено пользователем jenya7

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

10 minutes ago, jenya7 said:

нужно декомпилировать. как это сделать?

dtc -i dtb -o dts <file>

 

50 minutes ago, jenya7 said:

ret возвращает -1

На каком этапе? Вы его числами кормите вместо указателей.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

On 9/20/2022 at 12:46 PM, aaarrr said:

dtc -i dtb -o dts <file>

 

На каком этапе?

на первой же строке

ret = ioctl(fd, SPI_IOC_WR_MODE, 0);

On 9/20/2022 at 12:46 PM, aaarrr said:

 

На каком этапе? Вы его числами кормите вместо указателей.

а. я понял. может быть проблема.

 

я посмотрел файл

/dts-v1/;

/ {
	compatible = "allwinner,sun50i-h5";

	fragment@0 {
		target-path = "/aliases";

		__overlay__ {
			spi0 = "/soc/spi@1c68000";
			spi1 = "/soc/spi@1c69000";
		};
	};

	fragment@1 {
		target = <0xffffffff>;

		__overlay__ {
			#address-cells = <0x01>;
			#size-cells = <0x00>;

			spidev@0 {
				compatible = "armbian,spi-dev";
				status = "disabled";
				reg = <0x00>;
				spi-max-frequency = <0xf4240>;
			};
		};
	};

	fragment@2 {
		target = <0xffffffff>;

		__overlay__ {
			#address-cells = <0x01>;
			#size-cells = <0x00>;

			spidev@0 {
				compatible = "armbian,spi-dev";
				status = "disabled";
				reg = <0x00>;
				spi-max-frequency = <0xf4240>;
			};
		};
	};

	__fixups__ {
		spi0 = "/fragment@1:target:0";
		spi1 = "/fragment@2:target:0";
	};
};

очень настораживает строка

status = "disabled";

Изменено пользователем jenya7

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

30 minutes ago, jenya7 said:

очень настораживает строка

status = "disabled";

Если бы она оставалась, то устройства spidev не было бы.

 

Проверьте pinctrl:

mount -t debugfs - /sys/kernel/debug
cat /sys/kernel/debug/pinctrl/pinctrl-maps

И убедитесь, что пины spi никто не задействует как gpio.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

On 9/20/2022 at 1:22 PM, aaarrr said:

Если бы она оставалась, то устройства spidev не было бы.

 

Проверьте pinctrl:

mount -t debugfs - /sys/kernel/debug
cat /sys/kernel/debug/pinctrl/pinctrl-maps

И убедитесь, что пины spi никто не задействует как gpio.

ну это вроде соответствует действительности

device 1c68000.spi
state default
type MUX_GROUP (2)
controlling device 1c20800.pinctrl
group PC0
function spi0

device 1c68000.spi
state default
type MUX_GROUP (2)
controlling device 1c20800.pinctrl
group PC1
function spi0

device 1c68000.spi
state default
type MUX_GROUP (2)
controlling device 1c20800.pinctrl
group PC2
function spi0

device 1c68000.spi
state default
type MUX_GROUP (2)
controlling device 1c20800.pinctrl
group PC3
function spi0

по пинам это верно

image.thumb.png.90185e2e6d2eebdd91d2454cc9953cef.png

и больше никто к этим пинам не обращается.

Изменено пользователем jenya7

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

On 9/20/2022 at 1:38 PM, aaarrr said:

Попробуйте циклическую посылку осциллографом посмотреть.

не вижу никакого движения на пинах SPI

пробовал нативным методом

int SPI_Xfer(uint8_t *tx_buf, uint8_t *rx_buf, int size)
{
    int status;

     xfer[0].len = size;
     xfer[0].tx_buf = (unsigned long)tx_buf;
     xfer[1].len = size;
     xfer[1].rx_buf = (unsigned long)rx_buf;

     status = ioctl(spi_fd, SPI_IOC_MESSAGE(1), xfer);

     return  status;
}

тоже не работает.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

4 minutes ago, jenya7 said:

не вижу никакого движения на пинах SPI

Вообще ни на каких (CS, CLK, MOSI)? В каком они состоянии - H/L/Z?

Можно еще проверить, что время выполнения коррелирует с частотой SPI.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

On 9/20/2022 at 2:08 PM, aaarrr said:

Вообще ни на каких (CS, CLK, MOSI)? В каком они состоянии - H/L/Z?

Можно еще проверить, что время выполнения коррелирует с частотой SPI.

пины мертвые, все в нуле.

время исполнения? нужно вытащить atomic clock не уверен что у него резолюция в микросекундах.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

2 minutes ago, jenya7 said:

пины мертвые, все в нуле.

cat /sys/kernel/debug/gpio - мало ли

 

еще попробуйте перезагрузить драйвер spi:

echo 1c68000.spi > /sys/bus/platform/drivers/sun6i-spi/unbind

echo 1c68000.spi > /sys/bus/platform/drivers/sun6i-spi/bind

 

Just now, jenya7 said:

время исполнения? нужно вытащить atomic clock не уверен что у него резолюция в микросекундах.

Не нужно, достаточно N больших блоков.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

On 9/20/2022 at 2:55 PM, aaarrr said:

cat /sys/kernel/debug/gpio - мало ли

 

еще попробуйте перезагрузить драйвер spi:

echo 1c68000.spi > /sys/bus/platform/drivers/sun6i-spi/unbind

echo 1c68000.spi > /sys/bus/platform/drivers/sun6i-spi/bind

 

Не нужно, достаточно N больших блоков.

это значит на этих пинах нет проблем?

gpiochip1: GPIOs 0-223, parent: platform/1c20800.pinctrl, 1c20800.pinctrl:
 gpio-20  (                    |orangepi:red:status ) out lo 
 gpio-102 (                    |gmac-3v3            ) out hi 
 gpio-166 (                    |cd                  ) in  lo IRQ ACTIVE LOW
 gpio-204 (                    |usb0_id_det         ) in  hi IRQ 

gpiochip0: GPIOs 352-383, parent: platform/1f02c00.pinctrl, 1f02c00.pinctrl:
 gpio-354 (                    |usb0-vbus           ) out lo 
 gpio-355 (                    |sw4                 ) in  hi IRQ ACTIVE LOW
 gpio-362 (                    |orangepi:green:pwr  ) out hi 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...