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

Запуск USB на CH569/CH565

Народ, а кто-нибудь пробовал реализовать на CH569W мост USB-FIFO по типу CYUSB3014?

Или может быть есть у кого-нибудь грамотный пример приёма и отправки пакетов по USB3.0 на CH569W?

 

 

 

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


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

1 час назад, BSACPLD сказал:

Народ, а кто-нибудь пробовал реализовать на CH569W мост USB-FIFO по типу CYUSB3014?

Проект https://hydrabus.com/hydrausb3-v1-0-specifications/?v=ea8a1a99f6c9 и их репозитории на github смотрели?

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


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

14 minutes ago, makc said:

Проект https://hydrabus.com/hydrausb3-v1-0-specifications/?v=ea8a1a99f6c9 и их репозитории на github смотрели?

Да.

Сложилось впечатление, что это пример очень далёкий от реального применения.

В купе с отсутствием документации на USB3.0 периферию данный пример весьма проблематично применить в реальном проекте.

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


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

1 час назад, BSACPLD сказал:

В купе с отсутствием документации на USB3.0 периферию данный пример весьма проблематично применить в реальном проекте.

На сколько я понял, там один общий USB-контроллер и его регистры описаны в ДШ и есть в заголовочных файлах от производителя и в проекте Hydra. Поэтому проблемы с отладкой неизбежно будут, но мне это видится преодолимыми трудностями.

Дополнение: я ошибся, это два разных периферийных блока и у них разные базовые адреса, но для SS нет описания регистров.

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


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

1 minute ago, makc said:

На сколько я понял, там один общий USB-контроллер и его регистры описаны в ДШ и есть в заголовочных файлах от производителя и в проекте Hydra. Поэтому проблемы с отладкой неизбежно будут, но мне это видится преодолимыми трудностями.

На USB2.0 есть описание регистров, а на USB3.0 описание отсутствует.

В разделе про USB3.0 написано "используйте нашу библиотеку", а где её брать неизвестно.

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


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

1 час назад, BSACPLD сказал:

На USB2.0 есть описание регистров, а на USB3.0 описание отсутствует.

Вы правы, мне показалось что это один блок и у них одни и те же регистры. Но это не так.

1 час назад, BSACPLD сказал:

В разделе про USB3.0 написано "используйте нашу библиотеку", а где её брать неизвестно.

https://github.com/openwch/ch569/tree/main/EVT/EXAM/USBSS

У них там много примеров и для другой периферии.

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


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

2 hours ago, makc said:

Вы правы, мне показалось что это один блок и у них одни и те же регистры. Но это не так.

https://github.com/openwch/ch569/tree/main/EVT/EXAM/USBSS

У них там много примеров и для другой периферии.

При попытке собрать пример вылезает куча ошибок типа такой:

Description	Resource	Path	Location	Type
/home/sergey/Work/WCH/ch569/EVT/EXAM/USBSS/USBD/CH372Device/obj/../USB30/CH56x_usb30.c:528: undefined reference to `USB30_OUT_Set'	CH372Device		 	C/C++ Problem

Причем изначально вообще была ругань на отсутствие некоторых include - китайцы накосячили с верхним/нижним регистром в именах файлов.

Я это поправил, но не знаю как победить выше описанную ошибку.

Как будто среда не находит libCH56x_usb30.a в котором и должны быть данные функции.

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


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

8 часов назад, BSACPLD сказал:

Как будто среда не находит libCH56x_usb30.a в котором и должны быть данные функции.

Нужно смотреть строку запуска линковщика и тогда будет понятно где что ищется и почему не находится. Покажите, как запускается линковщик.

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


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

5 hours ago, makc said:

Нужно смотреть строку запуска линковщика и тогда будет понятно где что ищется и почему не находится. Покажите, как запускается линковщик.

Уже нашел.

В проекте почему-то был неправильно прописан путь к папке в которой лежит libCH56x_usb30.a.

Но теперь другая проблема.

Проект собрался, но не получается прошить ch569 из под Linux.

Прошивальщик упорно не видит устройство, хотя в /dev оно есть.

Запускал естественно от sudo по инструкции.

Ещё меня смутило, что в документации устройство названо /dev/ch37x, а по факту появляется устройство /dev/ch37x1.

Из под Windows плата прошивается без проблем, но хотелось бы прошивать сразу из под Linux.

 

 

 

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


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

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

Сделал loopback.

В EP1_OUT_Callback подтверждаю запись текущего пакета и инициирую обратную передачу.

void EP1_OUT_Callback(void)
{
    PRINT("EP1_OUT_Callback\n");

    UINT16 rx_len, i;
    UINT8  nump;
    UINT8  status;
    USB30_OUT_Status(ENDP_1, &nump, &rx_len, &status);

    for(int i=0 ; i<rx_len ; i++)
    {
    	PRINT("endp1RTbuff[%u] = %x\n", i, endp1RTbuff[i]);
    }

    USB30_OUT_ClearIT(ENDP_1);
    USBSS->UEP1_RX_DMA = (UINT32)(UINT8 *)endp1RTbuff;

    USB30_IN_Set(ENDP_1, DISABLE, ACK, 1, 1024);
    PRINT("USB30_Send_ERDY(ENDP_1 | IN, 1)\n");
    USB30_Send_ERDY(ENDP_1 | IN, 1);

    USB30_OUT_Set(ENDP_1, ACK, 1);
    PRINT("USB30_Send_ERDY(ENDP_1 | OUT, 1)\n");
    USB30_Send_ERDY(ENDP_1 | OUT, 1);
}

В EP1_IN_Callback обрабатываю передачу ответного пакета.

void EP1_IN_Callback(void)
{
    PRINT("EP1_IN_Callback\n");

    UINT8 nump;
    nump = USB30_IN_Nump(ENDP_1); //nump: 剩余待发送包数量

    for(int i=0 ; i<8 ; i++)
    {
       	PRINT("endp1RTbuff[%u] = %x\n", i, endp1RTbuff[i]);
    }

    PRINT("nump = %u\n", nump);

    USBSS->UEP1_TX_DMA = (UINT32)(UINT8 *)endp1RTbuff;
    USB30_IN_ClearIT(ENDP_1);

    USB30_IN_Set(ENDP_1, ENABLE, ACK, 1, 1024);
    PRINT("USB30_Send_ERDY(ENDP_1 | IN, 1)\n");
    USB30_Send_ERDY(ENDP_1 | IN, 1);
}

Пакет действительно отправляется обратно, но это происходит бесконечно вместо однократной отправки.

Что я делаю не так?

Может кто-нибудь поделиться рабочим примером для отправки пакетов в направлении "устройство->ПК"?

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


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

UPD.

Попробовал HYDRAUSB - не запускается отладка по UART.

Пробовал и через printf и через UART1_SendString - в приемной консоли тишина.

При этом через OpenWCH printf работает без проблем.

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


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

UPD2.

Взял библиотеку USB 3.0 от HYDRAUSB и создал проект с нуля.

В направлении "ПК->Устройство" все ОК.

В направлении "Устройство->ПК" как только я вызываю libusb_bulk_transfer устройство тут же возвращает мне пакет данных.

Насколько я понял, в библиотеке реализована мгновенная отправка данные по запросу от ПК даже если передавать нечего.

А мне нужно сделать как на CYUSB3014 с бесконечным ожиданием по вызову libusb_bulk_transfer пока не появятся данные для отправки.

Опыта с USB на столь низком уровне у меня не много - буду признателен если кто-нибудь поможет допилить библиотеку для CH569 для отправки пакета по наличию данных для отправки.

Проект прилагается.

ch569w_fw.7z

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


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

UPD3.

Пока изыскания следующие:

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

USB30_IN_set(ENDP_1, ENABLE, ACK, DEF_ENDP1_IN_BURST_LEVEL, 1024);
USB30_send_ERDY(ENDP_1 | IN, DEF_ENDP1_IN_BURST_LEVEL);

После этого начинает вызываться EP1_IN_Callback().

Когда данные закончились, нужно поменять состояние конечной точки на NRDY:

USB30_IN_set(ENDP_1, ENABLE, NRDY, DEF_ENDP1_IN_BURST_LEVEL, 1024);
USB30_send_ERDY(ENDP_1 | IN, DEF_ENDP1_IN_BURST_LEVEL);

И вот тут как раз и возникает проблема как определить момент, когда данные уже отправлены...

Я пробовал отслеживать изменение nump:

nump = USB30_IN_nump(ENDP_1); //nump: number of remaining packets to be sent

status = ACK;
if(prev_nump != nump)
{
    status = NRDY;
}

prev_nump = nump;

Но при таком подходе у меня успевает отправиться несколько пакетов прежде чем изменится nump...

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


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

Подниму тему.

Кому-нибудь удалось добиться работы USB 2.0 интерфейса (в моём случае хост) при работе МК на частоте, отличной от 120 МГц?
Судя по дереву сигналов тактирования проблем быть не должно и рабочая частота ядра и шины не должна влиять на работу контроллера и USB PHY, но по факту я вижу, что при настройке на частоту 60 МГц или 80 МГц транзакция запроса дейскриптора в процессе энумерации отваливается по тайм-ауту.
 

Все примеры от производителя настроены на 120 МГц, HydraUSB тоже на 120. Но для меня эта частота избыточна.

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


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

Что-бы включилась отладка в проекте HydraUSB, надо  в makefile раскомментировать одну строчку.
С ЮСБ 3.0 из примера HydraUSB заработало быстро, то с ЮСБ 2.0 проблемы.

Там сохраняется статус  ACK и если его не поменять на NAK, то хост считает ещё раз(и много раз). 

 Если не поставить опцию RB_UEP_T_AUTOTOG, то через пакет не отправляются данные.

С опцией RB_UEP2_BUF_MOD то же не заработало.

Да и нормального примера, где один эндпоинт IN , а второй OUT я не нашёл. И описание ЮСБ2.0 - просто издевательство.

Где-то в комментариях видел. что можно разогнать ядро до 160МГц, но будут проблемы с ЮСБ 3.0.

На 120МГц ЮАРТ работает на 7.5Мбод(3Мбод и 5Мбод тоже ) с CH347 (для 15Мбод я не нашёл переходник на ЮСБ).

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


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

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

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

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

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

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

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

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

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

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