Jump to content
    

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

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

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

 

 

 

Share this post


Link to post
Share on other sites

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

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

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

Share this post


Link to post
Share on other sites

14 minutes ago, makc said:

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

Да.

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

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

Share this post


Link to post
Share on other sites

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

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

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

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

Share this post


Link to post
Share on other sites

1 minute ago, makc said:

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

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

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

Share this post


Link to post
Share on other sites

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

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

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

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

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

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

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

Share this post


Link to post
Share on other sites

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 в котором и должны быть данные функции.

Share this post


Link to post
Share on other sites

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

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

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

Share this post


Link to post
Share on other sites

5 hours ago, makc said:

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

Уже нашел.

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

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

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

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

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

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

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

 

 

 

Share this post


Link to post
Share on other sites

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

Сделал 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);
}

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

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

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

Share this post


Link to post
Share on other sites

UPD.

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

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

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

Share this post


Link to post
Share on other sites

UPD2.

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

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

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

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

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

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

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

ch569w_fw.7z

Share this post


Link to post
Share on other sites

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...

Share this post


Link to post
Share on other sites

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

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

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

Share this post


Link to post
Share on other sites

Что-бы включилась отладка в проекте 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Мбод я не нашёл переходник на ЮСБ).

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...