Ник:
Пароль:

Контакты

E-mail: info@starterkit.ru
тел.: +7 922 680-21-73
тел.: +7 922 680-21-74
Телеграм: t.me/starterkit_ru

Способы оплаты

User Info


Добро пожаловать,
Guest

Регистрация или входРегистрация или вход
Потеряли пароль?Потеряли пароль?

Ник:
Пароль:

ПользователейПользователей:1
Поисковых ботовПоисковых ботов:3
ГостейГостей:1

ОбновитьПодробнееВсегоВсего:5
Форум » starterkit.ru » Процессорные модули » SK-9G45-OEM
Выводы USART на плате (нумерация и Hardware handshaking)
alekstr
Добавлено 01.02.2013 12:26
5
Сообщение: 1
alekstr
0

Пункты: 1244
Регистрация: 20.10.2011
Пол: Мужчина
Не понял логики нумерации выводов USART на схеме SK-9G45-MB V1.A. Выводы порта ttyS1 на схеме обозначены как UART0_TX и UART0_RX (обнаружил это в процессе попыток поработать с портом).
И еще вопрос - разведены ли у какого-либо из USART RTS и CTS?
Спуститься к концу Подняться к началу
Персональная информация
sasamy
Добавлено 01.02.2013 12:34 Редактировалось 01.02.2013 12:51 Сообщение: 2
sasamy
4.71

Пункты: 83540
Регистрация: 14.08.2009
Цитата

Не понял логики нумерации выводов USART на схеме SK-9G45-MB V1.A. Выводы порта ttyS1 на схеме обозначены как UART0_TX и UART0_RX


В Linux нумерация не обязана совпадать с нумерацией процессора, ttyS0 - это DBGU, а дальше остальные уарты по порядку но это при желании можно изменить в arch/arm/mach-at91/board-sam9m10g45ek.c

static void __init ek_map_io(void)
{
...

По поводу RTS/CTS - для UART0

SPI1_MOSI -> PB15/SPI1_MOSI/CTS0
SPI1_NCS -> PB17/SPI1_NPCS0/RTS0

если вам это подойдет..
Спуститься к концу Подняться к началу
Персональная информация
alekstr
Добавлено 01.02.2013 13:18 Сообщение: 3
alekstr
0

Пункты: 1244
Регистрация: 20.10.2011
Пол: Мужчина
Цитата

По поводу RTS/CTS - для UART0

SPI1_MOSI -> PB15/SPI1_MOSI/CTS0
SPI1_NCS -> PB17/SPI1_NPCS0/RTS0

если вам это подойдет..


Не могу найти SPI1_NPCS0 на схеме. Смотрел осциллографом SPI1_NCS (X6/20) - что-то не реагирует он на команды сброса/установки из программы.
Спуститься к концу Подняться к началу
Персональная информация
sasamy
Добавлено 01.02.2013 13:25 Редактировалось 01.02.2013 13:28 Сообщение: 4
sasamy
4.71

Пункты: 83540
Регистрация: 14.08.2009
Цитата

Не могу найти SPI1_NPCS0 на схеме.


То что я описал: слева от стрелки - обозначение на разъеме по схеме, справа - функциональное назначение.

Цитата

Смотрел осциллографом SPI1_NCS (X6/20) - что-то не реагирует он на команды сброса/установки из программы.


Вам нужно убрать описание соответствующих пинов SPI1 в инициализации иначе они там на SPI и переключатся. Или SPI1 исключить из инициализации вообще. См. board-sam9m10g45ek.c и at91sam9g45_devices.c и


void __init at91_add_device_spi(struct spi_board_info *devices, int nr_devices)
Спуститься к концу Подняться к началу
Персональная информация
alekstr
Добавлено 05.02.2013 12:26 Редактировалось 05.02.2013 12:36 Сообщение: 5
alekstr
0

Пункты: 1244
Регистрация: 20.10.2011
Пол: Мужчина
Цитата

Вам нужно убрать описание соответствующих пинов SPI1 в инициализации иначе они там на SPI и переключатся. Или SPI1 исключить из инициализации вообще. См. board-sam9m10g45ek.c и at91sam9g45_devices.c и


void __init at91_add_device_spi(struct spi_board_info *devices, int nr_devices)


В файле /buildroot-2012.02/output/build/linux-3.2.16-oem/arch/arm/mach-at91/at91sam9g45_devices.c в функцию __init at91_add_device_spi( внес следующие изменения:
Код

void __init at91_add_device_spi(struct spi_board_info *devices, int nr_devices)
{
int i;
unsigned long cs_pin;
short enable_spi0 = 0;
short enable_spi1 = 0;

/* Choose SPI chip-selects */
/*for (i = 0; i < nr_devices; i++) {*/
for (i = 0; i < 1; i++) { /* spi1 ne ispolzuem, vivodi pod com-port */
if (devices[i].controller_data)
cs_pin = (unsigned long) devices[i].controller_data;
else if (devices[i].bus_num == 0)
cs_pin = spi0_standard_cs[devices[i].chip_select];
else
cs_pin = spi1_standard_cs[devices[i].chip_select];

if (devices[i].bus_num == 0)
enable_spi0 = 1;
else
enable_spi1 = 1;

/* enable chip-select pin */
at91_set_gpio_output(cs_pin, 1);

/* pass chip-select pin to driver */
devices[i].controller_data = (void *) cs_pin;
}

spi_register_board_info(devices, nr_devices);

/* Configure SPI bus(es) */
if (enable_spi0) {
at91_set_A_periph(AT91_PIN_PB0, 0); /* SPI0_MISO */
at91_set_A_periph(AT91_PIN_PB1, 0); /* SPI0_MOSI */
at91_set_A_periph(AT91_PIN_PB2, 0); /* SPI0_SPCK */

platform_device_register(&at91sam9g45_spi0_device);
}
if (enable_spi1) {
// at91_set_A_periph(AT91_PIN_PB14, 0); /* SPI1_MISO */
// at91_set_A_periph(AT91_PIN_PB15, 0); /* SPI1_MOSI */
// at91_set_A_periph(AT91_PIN_PB16, 0); /* SPI1_SPCK */

// platform_device_register(&at91sam9g45_spi1_device);
}
}

Пересобрал ядро, записал uImage и распаковал rootfs на SD-карту (с нее грузится) - RTS из Qt-приложения так и не управляется.
Насколько я понял, инициализация выводов USART делается в функции
Код

static inline void configure_usart0_pins(unsigned pins)
{
at91_set_A_periph(AT91_PIN_PB19, 1); /* TXD0 */
at91_set_A_periph(AT91_PIN_PB18, 0); /* RXD0 */

if (pins & ATMEL_UART_RTS)
at91_set_B_periph(AT91_PIN_PB17, 0); /* RTS0 */
if (pins & ATMEL_UART_CTS)
at91_set_B_periph(AT91_PIN_PB15, 0); /* CTS0 */
}

Когда она должна вызываться: при загрузке системы или из приложения?
Спуститься к концу Подняться к началу
Персональная информация
sasamy
Добавлено 05.02.2013 13:02 Редактировалось 05.02.2013 13:19 Сообщение: 6
sasamy
4.71

Пункты: 83540
Регистрация: 14.08.2009
У атмеловцев с логикой небольшие проблемы - достаточно было бы исправить

if (devices[i].bus_num == 0)
enable_spi0 = 1;
else
enable_spi1 = 1;

на

if (devices[i].bus_num == 0)
enable_spi0 = 1;
else if (devices[i].bus_num == 1)
enable_spi1 = 1;

иначе независимо - есть ли устройства на spi1 они всегда переключают для него пины (что и происходит в нашем случае - у нас есть только устройство на програмном spi на gpio bus_num = 3 - а пины для spi1 все равно конфигурируются).
Вам осталось только указать драйверу UART использовать аппаратное управление потоком - поменять
в файле board-sam9m10g45ek.c

в ф-ии static void __init ek_init_early(void)

at91_register_uart(AT91SAM9G45_ID_US0, 1, 0);
на
at91_register_uart(AT91SAM9G45_ID_US0, 1, ATMEL_UART_CTS | ATMEL_UART_RTS);
Спуститься к концу Подняться к началу
Персональная информация
alekstr
Добавлено 06.02.2013 08:06 Сообщение: 7
alekstr
0

Пункты: 1244
Регистрация: 20.10.2011
Пол: Мужчина
Сработало, вывод управляется.
Спуститься к концу Подняться к началу
Персональная информация
titan83
Добавлено 04.03.2013 14:02 Сообщение: 8
titan83
3

Пункты: 3141
Регистрация: 16.12.2012
позволю себе поднять тему.
я тоже хочу управлять дополнительными линиями.
но у меня нет реакции даже на rx,tx на ttyS1, ttyS2, т.е. проверяю банально echo 1 > /dev/ttyS1(2) и не вижу ничего( при этом аналогичная команда для ttyS0 проходит нормально.
все, что рекомендовано в этой теме сделал.
Устройства ttyS1(2) в /dev имеются.

в ф-ии static void __init ek_init_early(void)
at91_register_uart(AT91SAM9G45_ID_US0, 1, 0);
на
at91_register_uart(AT91SAM9G45_ID_US0, 1, ATMEL_UART_CTS | ATMEL_UART_RTS);
у меня эта функция называется ek_map_io почему-то.

второй день пытаюсь побороть - не получается, поэтому прошу вас о помощи
спасибо
Спуститься к концу Подняться к началу
Персональная информация
Jury093
Добавлено 04.03.2013 16:24 Сообщение: 9
Jury093
4.5

Пункты: 54271
Регистрация: 25.05.2009
Пол: Мужчина
Из: Санкт-Петербург
Цитата
но у меня нет реакции даже на rx,tx на ttyS1, ttyS2, т.е. проверяю банально echo 1 > /dev/ttyS1(2) и не вижу
второй день пытаюсь побороть - не получается

и будете ходить по кругу.. я не зря спрашивал - на каких пинах какого разъема ищите?
- плата
- ревизия
- разъем и пины..

http://starterkit.ru/html/index.php?name=forum&op=view&id=10725#10798

На любой вопрос есть любой ответ.
Спуститься к концу Подняться к началу
Персональная информация
sasamy
Добавлено 04.03.2013 16:26 Сообщение: 10
sasamy
4.71

Пункты: 83540
Регистрация: 14.08.2009
Напишите - какая у вас плата, на какой версии ядра и на каком из UART-ов нужно аппаратное управление.
Спуститься к концу Подняться к началу
Персональная информация
Форум » starterkit.ru » Процессорные модули » SK-9G45-OEM