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

Как прописать ATA контроллер в Device Tree для Linux?

Поставил дополнительные printk.

Функция ocidec_init вызывается, а вот до pata_ocidec_probe не доходит.

Подключение в dts:

pata_ocidec@ff204000 {
		compatible = "pata_ocidec";
		reg = <0xff204000 0x100>;
	};

 

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


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

С probe разобрался.

Нужно было добавить в код драйвера имя для дерева устройств.

static const struct of_device_id ocidec_pata_dt_ids[] = {
	{
		.compatible = "pata_ocidec",
	}, {
		/* sentinel */
	}
};
static struct platform_driver pata_ocidec_driver = {
	.probe		= pata_ocidec_probe,
	.remove		= pata_ocidec_remove,
	.driver = {
		.name		= DRV_NAME,
		.of_match_table	= ocidec_pata_dt_ids,
		.owner		= THIS_MODULE,
	},
};
MODULE_DEVICE_TABLE(of, ocidec_pata_dt_ids);

Обновил dts до следующего:

pata_ocidec@ff204000 {
		compatible = "pata_ocidec";
		reg = <0xff204000 0x100>;
		interrupts = <0x0 0x47 0x1>;
	};

Но при запуске драйвера получаю ошибку:

root@atlas_sockit:~/project/pata_ocidec# insmod pata_ocidec.ko
pata_ocidec start
pata_ocidec probing
pata_ocidec ff204000.pata_ocidec: no IDE IRQ resource
pata_ocidec: probe of ff204000.pata_ocidec failed with error -22

Я так понимаю, что linux не может найти номер IRQ, но я вроде его прописал...

pata_ocidec.c

zImage-socfpga_cyclone5_de0_sockit.dts

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


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

Так у вас .dts принципиально неправильно написан. interrupts пишется с указанием phandle контроллера прерываний, как-то так:

interrupts = <&intc 0x47>

Ну и по остальному .dts куча вопросов, лень проверять все phandles. И почему не используете include .dtsi ?

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


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

32 minutes ago, gosha-z said:

И почему не используете include .dtsi ?

Я просто взял готовый dts шедший с отладочной платой и дописал недостающую периферию.

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


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

4 hours ago, gosha-z said:

interrupts = <&intc 0x47>

Странно...

В этом примере первый аргумент всегда 0:

https://rocketboards.org/foswiki/Documentation/HOWTOCreateADeviceTree

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


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

С interrupt тоже разобрался :)
Нужно было указать parent для прерывания.
Теперь драйвер стартует, но не может определить диск.
root@atlas_sockit:~/project/pata_ocidec# insmod pata_ocidec.ko
pata_ocidec start
pata_ocidec probing
pata_ocidec: registered at ff204000 100 irq 44
Mapped, setup port
cmd_addr = 0x00000000
ctl_addr = 0xC1562078
altstatus_addr = 0xC1562078
data_addr = 0xC1562040
error_addr = 0xC1562044
feature_addr = 0xC1562044
nsect_addr = 0xC1562048
lbal_addr = 0xC156204C
lbam_addr = 0xC1562050
lbah_addr = 0xC1562054
device_addr = 0xC1562058
status_addr      = 0xC156205C
command_addr     = 0xC156205C
pata_ocidec probe: priv=0xbeaf5350
READBACK : PATA_OCIDEC_CTRL = 0x00000092
READBACK : PATA_OCIDEC_PCTR = 0x17021C06
READBACK : PATA_OCIDEC_PCTR STS32 = 0x00000080
READBACK : PATA_OCIDEC_PCTR STS8  = 0x00000080
scsi host4: pata_ocidec
ata5: PATA max PIO6 cmd 0xff204040 ctl 0xff204078 irq 44
pata_ocidec_set_mode 0xBEAF5350 0
pata_ocidec: 0x0D000D02 0x000000FE 0x0D000D02 0x0D000D02
pata_ocidec: ctrl = 0x000000FE
ata5.00: failed to IDENTIFY (I/O error, err_mask=0x2)
pata_ocidec_set_mode 0xBEAF5350 0
pata_ocidec: 0x61066202 0x000000FE 0x61066202 0x61066202
pata_ocidec: ctrl = 0x000000FE
ata5: link is slow to respond, please be patient (ready=0)
ata5: device not ready (errno=-16), forcing hardreset
ata5.00: failed to IDENTIFY (I/O error, err_mask=0x2)
pata_ocidec_set_mode 0xBEAF5350 0
pata_ocidec: 0x0D000D02 0x000000FE 0x0D000D02 0x0D000D02
pata_ocidec: ctrl = 0x000000FE
ata5: link is slow to respond, please be patient (ready=0)
ata5: device not ready (errno=-16), forcing hardreset
ata5.00: failed to IDENTIFY (I/O error, err_mask=0x2)
pata_ocidec_set_mode 0xBEAF5350 0
pata_ocidec: 0x61066202 0x000000FE 0x61066202 0x61066202
pata_ocidec: ctrl = 0x000000FE
ata5: link is slow to respond, please be patient (ready=0)
ata5: device not ready (errno=-16), forcing hardreset

Хотя если выполнить команду IDENTIFY через самопальную утилиту, то она проходит.

Во всяком случает серийный номер и прочая информация считывается нормально.

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


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

Все. Заработало :)

1. Был битый кабель.

2. В последней версии контроллера с opencores.org была ошибка. Залипал сигнал прерывания. В более старой версии с форума Intel такой проблемы нет.

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


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

12 minutes ago, BSACPLD said:

Все. Заработало :)

И каков Performance? Или задачи "выжать максимум" не стояло? Интересно было бы сравнить с HW решением, например, от ZynqMP

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


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

43 minutes ago, gosha-z said:

И каков Performance?

Интересно даже просто узнать, что к нему подключать по нынешним временам.

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


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

2 minutes ago, aaarrr said:

что к нему подключать по нынешним временам.

SATA III диск - мало? Не знаю, как там у Интела, у цинка самые простенькие GTRы (которые насмерть к PS прибиты) 6G тянут.

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


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

1 hour ago, aaarrr said:

Интересно даже просто узнать, что к нему подключать по нынешним временам.

PC card ATA диск. Это требование заказчика. По принципу "шоб было".

Т.к. такую древность еще надо постараться найти, для тестов я взял китайский переходник IDE<->SATA.

Теперь по Performance.

К сожалению, текущий вариант драйвера, не поддерживает DMA. Готового решения я не нашел, так что придется писать самому.

В режиме PIO получилось 10МБ/с на чтение и около 4МБ/с на запись.

Насчет цинка и SATA могу сказать, что это следующая задача. Просто пока отлаживал то, что мог, и на том, что есть под рукой.

Честно говоря, не знаю с какой стороны взяться за эту задачу. Готового решения нет, корку вряд ли купят. 

Нашел корку x393, но там опять же только HDL без драйвера.

https://git.elphel.com/Elphel/x393_sata

Собраться то она собралась, но как её прикручивать к системе я пока не представляю...

P.S.

Приложил поправленный драйвер, dts и HDL.

pata_ocidec.7z

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


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

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

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

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

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

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

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

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

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

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