Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: STM32F4xx Isochronous Feedback
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
Left Radio
Собственно вопрос вот в чем, пытаюсь запустить асинхронный режим с явной обратной связью через feedback EP, естественно начал с изучения примеров и стандарта, вроде все получилось, устройство определяется, USBlyzer-ом вижу что идут OUT пакеты, а IN нет, хост время от времени делает URB Sync Reset Pipe and Clear Stall (success), затем идет, как я понял задержанная, передача URB Isoch Transfer (issued) и по завершению, после передачи OUT пакета, по IN - 0 bytes data. При этом никаких прерываний по FB EP не происходит sad.gif
Вот я никак и не могу понять как мне собственно передать 3 байтный FB пакет на хост. Использую STM OTG Driver 2.1 и переделанный ихний же пример USB аудио. Контрольную точку для явной обратной связи в дескрипторе описал уверен что правильно, но так и не могу дождаться epin прерывания по этой точке, по нулевой (при конфигурации) прерывания происходят как при out, так и при in пакетах. Возможно кто то сталкивался, или делал что то похожее, помогите плиз, или подскажите куда копать, уже 4 день не могу заставить работать.

Пробовал при инициализации передать по feedback EP:
Код
static uint8_t  usbd_audio_Init (void  *pdev, uint8_t cfgidx)
{  
    /* Open EP OUT/IN */
    DCD_EP_Open(pdev, AUDIO_OUT_EP, AUDIO_OUT_PACKET, USB_OTG_EP_ISOC);
    DCD_EP_Open(pdev, AUDIO_IN_EP, AUDIO_IN_PACKET, USB_OTG_EP_ISOC);
    
        DCD_EP_Tx (pdev, AUDIO_IN_EP, bufs, 3);
        
    /* Initialize the Audio output Hardware layer */
    if (AUDIO_OUT_fops.Init(USBD_AUDIO_FREQ, DEFAULT_VOLUME, 0) != USBD_OK){ return USBD_FAIL; }

    /* Prepare Out endpoint to receive audio data */
    DCD_EP_PrepareRx(pdev, AUDIO_OUT_EP, (uint8_t*)IsocOutBuff, AUDIO_OUT_PACKET);

    return USBD_OK;
}

Еще хуже, устройство перестает работать, хотя и по прежнему определяется правильно.

Вот дескрипторы:
CODE

/* Configuration 1 */
0x09, /* bLength */
USB_CONFIGURATION_DESCRIPTOR_TYPE, /* bDescriptorType */
LOBYTE(AUDIO_CONFIG_DESC_SIZE), /* wTotalLength 118 bytes*/
HIBYTE(AUDIO_CONFIG_DESC_SIZE),
0x02, /* bNumInterfaces */
0x01, /* bConfigurationValue */
0x00, /* iConfiguration */
0xC0, /* bmAttributes BUS Powred*/
0x32, /* bMaxPower = 100 mA*/
/* 09 byte*/

/* USB Speaker Standard interface descriptor */
AUDIO_INTERFACE_DESC_SIZE, /* bLength */
USB_INTERFACE_DESCRIPTOR_TYPE, /* bDescriptorType */
0x00, /* bInterfaceNumber */
0x00, /* bAlternateSetting */
0x00, /* bNumEndpoints */
USB_DEVICE_CLASS_AUDIO, /* bInterfaceClass */
AUDIO_SUBCLASS_AUDIOCONTROL, /* bInterfaceSubClass */
AUDIO_PROTOCOL_UNDEFINED, /* bInterfaceProtocol */
0x00, /* iInterface */
/* 09 byte*/

/* USB Speaker Class-specific AC Interface Descriptor */
AUDIO_INTERFACE_DESC_SIZE, /* bLength */
AUDIO_INTERFACE_DESCRIPTOR_TYPE, /* bDescriptorType */
AUDIO_CONTROL_HEADER, /* bDescriptorSubtype */
0x00, /* 1.00 */ /* bcdADC */
0x01,
0x27, /* wTotalLength = 39*/
0x00,
0x01, /* bInCollection */
0x01, /* baInterfaceNr */
/* 09 byte*/

/* USB Speaker Input Terminal Descriptor */
AUDIO_INPUT_TERMINAL_DESC_SIZE, /* bLength */
AUDIO_INTERFACE_DESCRIPTOR_TYPE, /* bDescriptorType */
AUDIO_CONTROL_INPUT_TERMINAL, /* bDescriptorSubtype */
0x01, /* bTerminalID */
0x01, /* wTerminalType AUDIO_TERMINAL_USB_STREAMING 0x0101 */
0x01,
0x00, /* bAssocTerminal */
0x02, /* bNrChannels */
0x03, /* wChannelConfig 0x0003 - Left&Right; 0x0000 - Mono; 0x0004 - FrontCenter */
0x00,
0x00, /* iChannelNames */
0x00, /* iTerminal */
/* 12 byte*/

/* USB Speaker Audio Feature Unit Descriptor */
0x09, /* bLength */
AUDIO_INTERFACE_DESCRIPTOR_TYPE, /* bDescriptorType */
AUDIO_CONTROL_FEATURE_UNIT, /* bDescriptorSubtype */
AUDIO_OUT_STREAMING_CTRL, /* bUnitID */
0x01, /* bSourceID */
0x01, /* bControlSize */
AUDIO_CONTROL_MUTE, /* bmaControls(0) */
0x00, /* bmaControls(1) */
0x00, /* iTerminal */
/* 09 byte*/

/*USB Speaker Output Terminal Descriptor */
0x09, /* bLength */
AUDIO_INTERFACE_DESCRIPTOR_TYPE, /* bDescriptorType */
AUDIO_CONTROL_OUTPUT_TERMINAL, /* bDescriptorSubtype */
0x03, /* bTerminalID */
0x02, /* wTerminalType 0x0302, headphones*/
0x03,
0x00, /* bAssocTerminal */
0x02, /* bSourceID */
0x00, /* iTerminal */
/* 09 byte*/

/* USB Speaker Standard AS Interface Descriptor - Audio Streaming Zero Bandwith */
/* Interface 1, Alternate Setting 0 */
AUDIO_INTERFACE_DESC_SIZE, /* bLength */
USB_INTERFACE_DESCRIPTOR_TYPE, /* bDescriptorType */
0x01, /* bInterfaceNumber */
0x00, /* bAlternateSetting */
0x00, /* bNumEndpoints */
USB_DEVICE_CLASS_AUDIO, /* bInterfaceClass */
AUDIO_SUBCLASS_AUDIOSTREAMING, /* bInterfaceSubClass */
AUDIO_PROTOCOL_UNDEFINED, /* bInterfaceProtocol */
0x00, /* iInterface */
/* 09 byte*/

/* USB Speaker Standard AS Interface Descriptor - Audio Streaming Operational */
/* Interface 1, Alternate Setting 1 */
AUDIO_INTERFACE_DESC_SIZE, /* bLength */
USB_INTERFACE_DESCRIPTOR_TYPE, /* bDescriptorType */
0x01, /* bInterfaceNumber */
0x01, /* bAlternateSetting */
0x02, /* bNumEndpoints */
USB_DEVICE_CLASS_AUDIO, /* bInterfaceClass */
AUDIO_SUBCLASS_AUDIOSTREAMING, /* bInterfaceSubClass */
AUDIO_PROTOCOL_UNDEFINED, /* bInterfaceProtocol */
0x00, /* iInterface */
/* 09 byte*/

/* USB Speaker Audio Streaming Interface Descriptor */
AUDIO_STREAMING_INTERFACE_DESC_SIZE, /* bLength */
AUDIO_INTERFACE_DESCRIPTOR_TYPE, /* bDescriptorType */
AUDIO_STREAMING_GENERAL, /* bDescriptorSubtype */
0x01, /* bTerminalLink */
0x00, /* bDelay */
0x01, /* wFormatTag AUDIO_FORMAT_PCM 0x0001*/
0x00,
/* 07 byte*/

/* USB Speaker Audio Type I Format Interface Descriptor */
0x0B, /* bLength */
AUDIO_INTERFACE_DESCRIPTOR_TYPE, /* bDescriptorType */
AUDIO_STREAMING_FORMAT_TYPE, /* bDescriptorSubtype */
AUDIO_FORMAT_TYPE_I, /* bFormatType */
0x02, /* bNrChannels */
AUDIO_FRAME_SIZE, /* bSubFrameSize; bytes per frame */
AUDIO_BITRESOLUTION, /* bBitResolution; bits per sample */
0x01, /* bSamFreqType only one frequency supported */
SAMPLE_FREQ(USBD_AUDIO_FREQ), /* Audio sampling frequency coded on 3 bytes */
/* 11 byte*/


/* Endpoint 1 - Standard Descriptor */
AUDIO_STANDARD_ENDPOINT_DESC_SIZE, /* bLength */
USB_ENDPOINT_DESCRIPTOR_TYPE, /* bDescriptorType */
AUDIO_OUT_EP, /* bEndpointAddress 1 out endpoint, 0х01*/
USB_ENDPOINT_TYPE_ISOCHRONOUS | (1<<2), /* bmAttributes, isochronus, async */
AUDIO_PACKET_SZE(USBD_AUDIO_FREQ), /* wMaxPacketSize in Bytes (Freq(Samples)*2(Stereo)*2(HalfWord)) */
0x01, /* bInterval */
0x01, /* bRefresh */
AUDIO_IN_EP, /* bSynchAddress */
/* 09 byte*/

/* Endpoint - Audio Streaming Descriptor*/
AUDIO_STREAMING_ENDPOINT_DESC_SIZE, /* bLength */
AUDIO_ENDPOINT_DESCRIPTOR_TYPE, /* bDescriptorType */
AUDIO_ENDPOINT_GENERAL, /* bDescriptor */
0x00, /* bmAttributes, default 0x00 */
0x00, /* bLockDelayUnits */
0x00, /* wLockDelay */
0x00,
/* 07 byte*/


/* Endpoint 2 - Standard Descriptor, FB */
AUDIO_STANDARD_ENDPOINT_DESC_SIZE, /* bLength */
USB_ENDPOINT_DESCRIPTOR_TYPE, /* bDescriptorType */
AUDIO_IN_EP, /* bEndpointAddress 2, in FB endpoint, 0х81*/
USB_ENDPOINT_TYPE_ISOCHRONOUS|(1<<4), /* bmAttributes, feedback endpoint(explict) */
0x03, 0x00, /* wMaxPacketSize in Bytes */
0x01, /* bInterval */
0x05, /* bRefresh */
0x00, /* bSynchAddress */
/* 09 byte*/
controller_m30
А что такое feedback EP? Это просто EndPoint1...7, или что-то особенное?
Ещё не очень понятно, зачем для передачи 3 байт затевать изохронную передачу данных как для потока аудио-видео?
Если изохронная передача к Хосту здесь не обязательная, то вот мои соображения.

У меня на столе USB-колонки, с 3 кнопками (+, -, mute), USBlizer говорит что это устройство HID и т.д.
Если с компьютера запустить музыку - то будут только пакеты OUT. Хоть 1 минуту, хоть 10 минут. Также и звуки сопровождающие открытие/закрытие окон, или программ - вызывают только пакеты OUT.
Также в начале каждого нового трека происходит "Sync Reset Pipe and Clear Stall"
Пакеты IN появляются только при нажатии кнопок на колонках.

Когда передаётся музыка в колонки (пакеты OUT) - USBlizer пишет что это "Isoch Transfer".
А когда происходит прерывание от кнопок (пакеты IN) - пишет что это "Bulk or Interrupt Transfer"

EndPoint-ов всего 2: OUT1 и IN2. Указано что OUT1 - это Isochronus, а IN2 - это Interrupt.



Судя по описанию IN-дескриптора, Хост каждые 10мс опрашивает Device, но в USBlizer эти запросы не отражены. Но т.к. в потоке пакетов при нажатии на кнопку появляются Interrupt-пакеты - значит Хост всё-же опрашивает Device.

Наверное надо переделать дескриптор IN2 по типу Interrupt (а не Isochronus как сейчас), и при наличии данных для Хоста записывать эти данные в EP2_IN. А когда Хост в очередной раз опросит EP2_IN, то он получит ACK и данные. А при отсутствии данных - будет получать NACK.
http://microsin.ru/content/view/1107/44/ - тут есть про "Передачи Interrupt".
ig_z
QUOTE (Left Radio @ Oct 2 2013, 03:29) *
Возможно кто то сталкивался, или делал что то похожее, помогите плиз, или подскажите куда копать, уже 4 день не могу заставить работать.

Вот часть моего дескриптора. Я вижу разницу в поле bRefresh.
CODE
/* Endpoint, EP3 ISO OUT - Standard Descriptor */\
  AUDIO_STANDARD_ENDPOINT_DESC_SIZE, /* bLength */\
  USB_ENDPOINT_DESCRIPTOR_TYPE,      /* bDescriptorType */\
  ADC_DATA_O_EP_LOG,               /* bEndpointAddress */\
  EP_ISO_OUT_ATTRIB,                 /* bmAttributes */\
  WBVAL(SAMPL_PER_FRAME_48 * SubFrameSize * 2), /* wMaxPacketSize */\
  0x01,                              /* bInterval */\
  0x00,                              /* bRefresh */\
  ADC_DATA_OUT_EP_SYNC_ADDR,         /* bSynchAddress */\


Тестил под вин7 только.
Left Radio
controller_m30, interrupt и/или bulk передачи сдесь нипричем, стандарт на USB допускает 4 вида синхронизации изохронных передач:
None; Asynchronous; Syncrhonous; Adaptive. Ваши клонки работают в Adaptive, то есть подстравают свою частоту под часоту SOF пакетов USB, мне такой режим, к сожалению, неподходит, так как устройство должно работать от внешнего такта, который нельзя подстроить исходя из частоты SOF пакетов. Feedback Endpoint это обычная конечная точка, работающая в обратном направлении с конечной точкой передачи аудиоданных, она дожна быть обьявлена как изохронная и в поле bmAttributes, в битах [5:4], должно быть 10, что указывает на использование этой конечной токи для явной обратной связи. А HID в Ваших колонках совсем для другого, это просто управление.

ig_z, спасибо, я смотрел исходники sdr-widget, там поле bRefresh было как у меня. Я пробовал ставить 0, но эффекта ноль, каким образом Вы отправляете данные обратной сязи? Получаете прерываие по INEP?
ig_z
QUOTE (Left Radio @ Oct 2 2013, 15:20) *
ig_z, спасибо, я смотрел исходники wm-widget, там поле bRefresh было как у меня. Я пробовал ставить 0, но эффекта ноль, каким образом Вы отправляете данные обратной сязи? Получаете прерываие по INEP?

У меня ЛПЦ. Отправляет/принимает юсб модуль. Я только подготавливаю необходимые данные.
Т.е. вы говорите драйверу хоста, что у вас изохронный асинхронный експлисит девайс.
Хост будет слать аудио данные на каждый соф и запрашивать фидбек данные через заданное вами кол-во соф-ов. Если вы правильно настроили фидбековскую конечную точку и там есть данные, то юсб модуль отправит данные хосту.
Как это сделано в стм32 я не в курсе. Стараюсь как можно подальше отложить необходимость работы с ними sm.gif
Left Radio
Да, хост вроде запрашивает данные, это вижу в USBlyzer, но как мне их отправить понять немогу sad.gif , если пытаюсь стартануть отправку сразу после инициализации, то вижу ошибки на шине, передача отменяется. Пробовал отправлять по EOPF, вроде передается, но только поначалу, после передачи прекращаются и опять идут посылки нулевой длинны.
Left Radio
Цитата(ig_z @ Oct 2 2013, 16:38) *
У меня ЛПЦ. Отправляет/принимает юсб модуль. Я только подготавливаю необходимые данные.

А код посмотреть можно, или это коммерческая разработка? Я не придумав ничего лучше завел таймер и по прерыанию таймера отправляю данные, точнее ложу их в FIFO Feedback Endpoint, вижу что данные по запросу хоста уходят, но работать правильно не хочет, вместо запрашиваемых 192-ух байт пересылает 172-176, изменяю количество на, скажем, 92 байта, но ничего не изменяется, все те же 172-176 байт wacko.gif
Left Radio
Раз никто не помогает пришлось самому sm.gif, не скажу что полнстью доволен, но винда слушается, количество байт в пакетах меняется. Отправку данных в FB endpoint сделал по SOF, когда интерфейс уже переключен на 1-ый(воспроизведение). Просто считаю кличество SOF-ов до 2^5 (тот же интервал у меня указан в дискрипторе FB endpoint, в поле bRefresh). Доходят до хоста нормально, иногда правда нет, но в спецификации указано что если изменений нет, то вполне допустимо ответить пакетом нулевой длинны, что иногда и происходит. Думаю для исключения ситуаций когда нужно резко поменять количество байт, а как раз идут пропуски FB пакетов, нужно сделать буфер побольше.

Так и не понял почему данные обратной связи в формате 10.14 дожны формироватся следующим образом -
Код
static uint8_t bufs[3];
uint32_t FB_rate = (USBD_AUDIO_FREQ == 44100)? (44 << 14) + ((1 << 14) / 10) : (USBD_AUDIO_FREQ / 1000) << 14;

bufs[0] = (uint8_t)(FB_rate);
bufs[1] = (uint8_t)(FB_rate >> 8);
bufs[2] = (uint8_t)(FB_rate >> 16);

DCD_EP_Flush(&USB_OTG_dev, AUDIO_IN_EP);
DCD_EP_Tx (&USB_OTG_dev, AUDIO_IN_EP, bufs, 3);


Но это факт (это подсмотрел в том же sdr-widget), если кто нибудь обьяснит, то буду весьма признателен sm.gif
И еще небольшой вопрос об очистке FIFO, в коде - DCD_EP_Flush(&USB_OTG_dev, AUDIO_IN_EP);, нужна и она?
ig_z
QUOTE (Left Radio @ Oct 2 2013, 21:40) *
А код посмотреть можно, или это коммерческая разработка?

Да вроде там все просто, как угол дома. ЮСБ стек стандартный кейловский.
CODE

void USB_SOF_Event(void)
{
//STORE_DMA_SAMPLES();
STORE_DD_OUT_STATUS();
STORE_DD();

if ((USB_DeviceAddress != 0)&&(USB_Configuration != 0))
{
uint32_t numOutEP, numFBackEP, numInEP;

numOutEP = ProcessOutEP();
numFBackEP = ProcessFeedbackEP();
numInEP = ProcessInEP(numOutEP);

STORE_NUM_SAMPLES(numOutEP);

if ((iso_in_size == 44*4)||(iso_in_size == 48*4))
{
numFBackEP *=4;
}
else if ((iso_in_size == 44*6)||(iso_in_size == 48*6))
{
numFBackEP *=6;
}
else
{
//should never happen
}

STORE_NUM_FB_SAMPLES(numFBackEP / (1<<14));
STORE_NUM_IN_SAMPLES(numInEP);
}
SOF_EV();
}

uint32_t ProcessFeedbackEP()
{
int32_t fb = getFeedbackValue();

if (fb == 0)
{
DBG_INFO_MSG("ProcessFeedbackEP ERROR!!!! FeedbackRate = 0x%X =========================",FeedbackRate);
}
#if (USB_ADC_SYNC_MODE == USB_ADC_SYNC_MODE_EXPLISIT_FB)

IsoFBBuff = fb;

#if (USB_DMA_FB == 0) // sw copy for FEEDBACK EP

USB_WriteEP(ADC_F_BACK_EP_LOG, (uint8_t*)&IsoFBBuff, 3);

#else // (USB_DMA_FB == 0) DMA copy for FEEDBACK EP

//DD_ISO_FB_Mem[0] = 0;
//DD_ISO_FB_Mem[1] = (1<<16) | (1<<4); //isoc packet, length = 1 packet
DD_ISO_FB_Mem[0] = (uint32_t)DD_ISO_FB_Mem;
DD_ISO_FB_Mem[1] = (1<<16) | (1<<4) | (1<<2); //isoc packet, length = 1 packet
DD_ISO_FB_Mem[2] = (uint32_t)&IsoFBBuff;
DD_ISO_FB_Mem[3] = 0;
DD_ISO_FB_Mem[4] = (uint32_t)&InfoFBBuf;
InfoFBBuf = 3|0x10000;

#endif //(USB_DMA_FB == 0) SW/DMA copy for FEEDBACK EP
#endif //(USB_ADC_SYNC_MODE == USB_ADC_SYNC_MODE_EXPLISIT_FB)

return fb;
}

USB_SOF_Event() обработчик софа. Макросы в USB_SOF_Event() отладочные. Три байта передаются в юсб модуль в ProcessFeedbackEP(). Ничего необычного, за исключением того, что юсб модуль ЛПЦ не в состоянии продетектить изохронный запрос с хоста.

QUOTE (Left Radio @ Oct 3 2013, 06:22) *
Но это факт (это подсмотрел в том же sdr-widget), если кто нибудь обьяснит, то буду весьма признателен sm.gif
И еще небольшой вопрос об очистке FIFO, в коде - DCD_EP_Flush(&USB_OTG_dev, AUDIO_IN_EP);, нужна и она?

Объяснить это трудно. Это больше выглядит как инициализация FB_rate. В обработчике FB_rate должна накапливать значения (что то типа FB_rate +/- дельта).
Давно не смотрел сдр-виджет, он уже может работать на стм32?
Left Radio
Спасибо, значит я пришел к такому же решению. С форматом данных обратной связи то же разобрался, сбило с толку требование указать количество байт в пакете, это было в одном русскоязычном описании, а как оказалось нужно указывать только Fsample/Fsof, ну тут сам виноват, нужно было смотреть внимательней в спецификацию, а не в сомнительные переводы sm.gif.

В общем проблема решена, еще раз спасибо.
nikkov
Left Radio, UAC 1 реализуете?
Left Radio
Да, UAC 1, за UAC 2 пока не берусь, доведу полностью до ума и хочу перейти на HS(USB3320), затем возможно за UAC 2 возмусь. Правда драйвера никогда не писал, поэтому вероятно на основе sdr-widget.
nikkov
Цитата(Left Radio @ Oct 4 2013, 02:34) *
Да, UAC 1, за UAC 2 пока не берусь, доведу полностью до ума и хочу перейти на HS(USB3320), затем возможно за UAC 2 возмусь. Правда драйвера никогда не писал, поэтому вероятно на основе sdr-widget.

Просто я участвовал в написании прошивки для *-Widget и ASIO драйвера для него, но некоторые ограничения avr32 охладили к нему мой интерес. Сейчас смотрю в сторону LPC18**/LPC43** от NXP, т.к. у них есть нормальный HS.
Left Radio
Хороший проект, респект wink.gif, а какие ограничения avr32 неустроили? LPC18**/LPC43** неплохие машинки, тоже смотрел в их сторону, но потом решил в пользу STM32F407, так как знаю их лучше, а с LPC никогда не работал. Пока устраивает полностью, жаль конечно нет HS PHY. Сейчас довожу до ума работу с UAC 1 и доделываю управление для Si5351. Можно сказать в самом начале sm.gif
nikkov
Цитата(Left Radio @ Oct 4 2013, 09:23) *
Респект wink.gif, а какие ограничения avr32 неустроили? LPC18**/LPC43** неплохие машинки, тоже смотрел в их сторону, но потом решил в пользу STM32F407, так как знаю их лучше, а с LPC никогда не работал. Пока устраивает полностью, жаль конечно нет HS PHY. Сейчас довожу до ума работу с UAC 1 и доделываю управление для Si5351. Можно сказать в самом начале sm.gif

Не устроили 2 момента:
1 - размер буфера EP 512 байт, что уменьшает вдвое пропускную способность, отчего для UAC1 доступна частота максимум 48кГц;
2 - невозможность сконфигурировать 2 EP с одним номером, но с разными направлениями. Это не позволило запустить ввод с SDR-Widget с драйверами от других UAC2 карт, при том, что вывод работает.

У меня нет опыта работы ни с LPC, ни с STM, поэтому мне проще biggrin.gif (с АВР32 его тоже не было), а выбор LPC обусловлен наличием HS PHY.
Left Radio
Цитата(nikkov @ Oct 4 2013, 05:37) *
Невозможность сконфигурировать 2 EP с одним номером, но с разными направлениями. Это не позволило запустить ввод с SDR-Widget с драйверами от других UAC2 карт, при том, что вывод работает.

А вот это интересно, хорошо что в STM так можно, собственно сейчас у меня у IN и OUT один номер, значит можно будет надеяться прикрутить драйвера других карт, и работать в обеих направлениях cool.gif. 512 байт конечно печально, а я то думаю почему только 48 для UAC1, когда в исходниках лазил. По поводу HS PHY, прикручу USB3320, когда конечно нет предпочтений возможно действительно проще, всё равно ведь изучать, так лучше уж то что больше подходит sm.gif, а мне проще внешний прикрутить чем переходить сейчас на LPC.
Единственный пока недостаток - невозможность работы с форматом 24 BCK на фрейм, только 16/32, правда не знаю умеет ли это LPC, но при большой необходимости можно завести данные в ПЛИС, а там уже получить любой формат не проблема. Плюс ПЛИС даст еще кучу всяких возможностей, например соединиться по параллельной шине и получить сколько нужно I2S выходов а не только 2. Но это если и буду делать, то не сейчас, хотя EPM570 уже прикупил sm.gif.
nikkov
Цитата(Left Radio @ Oct 4 2013, 12:27) *
А вот это интересно, хорошо что в STM так можно, собственно сейчас у меня у IN и OUT один номер, значит можно будет надеяться прикрутить драйвера других карт, и работать в обеих направлениях cool.gif. 512 байт конечно печально, а я то думаю почему только 48 для UAC1, когда в исходниках лазил. По поводу HS PHY, прикручу USB3320, когда конечно нет предпочтений возможно действительно проще, всё равно ведь изучать, так лучше уж то что больше подходит sm.gif, а мне проще внешний прикрутить чем переходить сейчас на LPC.
Единственный пока недостаток - невозможность работы с форматом 24 BCK на фрейм, только 16/32, правда не знаю умеет ли это LPC, но при большой необходимости можно завести данные в ПЛИС, а там уже получить любой формат не проблема. Плюс ПЛИС даст еще кучу всяких возможностей, например соединиться по параллельной шине и получить сколько нужно I2S выходов а не только 2. Но это если и буду делать, то не сейчас, хотя EPM570 уже прикупил sm.gif.

У LPC тоже 8/16/32 у I2S, но это вроде не проблема, т.к. почти все ЦАП-ы поддерживают 32BCK, а если нет, то либо ПЛИС, либо что-то типа AD1896 должно подойти.
Кстати, чем еще интересен LPC43XX, это режимом SGPIO, который позволяет реализовать многоканальный I2S.

Немного на-оффтопил я тут biggrin.gif , но тема лично мне интересная.
ig_z
QUOTE (nikkov @ Oct 4 2013, 05:37) *
У меня нет опыта работы ни с LPC, ни с STM, поэтому мне проще biggrin.gif (с АВР32 его тоже не было), а выбор LPC обусловлен наличием HS PHY.

А Вы могли бы более подробно описать свой проект? Т.е. какой юсб стек используете, планируете аудио входы, интересна ли мнимизация задержки, сколько каналов и т.д.?

У меня в данный момент есть лпс1768, стм32ф407 и лпс4337.
На сегодняшний день у меня работает лпс1768 как юсб лупбек. Режим синхронизации - асинхронный, пробовал и експлисит и имплисит. В принципе я сейчас принимаю решение, переходить на 4337 или все же закончить с 1768.
Сейчас я работаю с Кейловским юсб стеком. Пробовал изохронную передачу на LPCUSB. В будущем планирую перебраться на NXP USB стек.
Особо интересует минимизация задержки по входу и выходу.

Возможно вы помните, я как то обращался к вам по почте, интересовался вашим дайвером для UAC2. В финале было бы интересно сравнить коммерческие драйвера для вин, ваш драйвер и встроенные в мак и линукс.

ПС может вы знаете/подскажете более активные форумы по теме разаработки юсб аудио.
nikkov
Цитата(ig_z @ Oct 4 2013, 16:11) *
А Вы могли бы более подробно описать свой проект? Т.е. какой юсб стек используете, планируете аудио входы, интересна ли мнимизация задержки, сколько каналов и т.д.?

У меня в данный момент есть лпс1768, стм32ф407 и лпс4337.
На сегодняшний день у меня работает лпс1768 как юсб лупбек. Режим синхронизации - асинхронный, пробовал и експлисит и имплисит. В принципе я сейчас принимаю решение, переходить на 4337 или все же закончить с 1768.
Сейчас я работаю с Кейловским юсб стеком. Пробовал изохронную передачу на LPCUSB. В будущем планирую перебраться на NXP USB стек.
Особо интересует минимизация задержки по входу и выходу.

Возможно вы помните, я как то обращался к вам по почте, интересовался вашим дайвером для UAC2. В финале было бы интересно сравнить коммерческие драйвера для вин, ваш драйвер и встроенные в мак и линукс.

ПС может вы знаете/подскажете более активные форумы по теме разаработки юсб аудио.

Да пока нечего описывать. Просто хочу доделать нормальную реализацию USB Audio. АВР32 не совсем для этого годен, поэтому выбрал для себя LPC. На данный момент ничего нет, кроме плат собственной разработки с LPC1837 и LPC4337, да китайского кита open4337 на том же LPC4337. В качестве ЦАП-а и АЦП на момент разработки хочу использовать небольшой модуль на UDA1380 который можно подключить и к моим платам (как и его же Ethernet). Выбор стеков еще впереди, т.к. пока нет времени заняться программированием, да и жду выхода LPCOpen 2.

Мой ASIO драйвер хорош только тем, что он open-source / бесплатный, ну и данные выводятся в обход звуковой подсистемы виндовс, поэтому никакие микшеры на него не влияют. Ну и он пока единственный легальный бесплатный способ вывести под Windows через USB 192 кГц/24 бит.
Коммерческие драйверы для Windows от Thesycon гораздо лучше, так как это полноценные драйверы с поддержкой ASIO, но они не бесплатны.
У Linux и мака с UAC2 проблем нет.

Самый активный форум по этой тематике - это была группа Audio-Widget в гугл-групп. Но сейчас там затишье, основной разработчик, Alex Lee, делает (даже можно сказать сделал) реализацию на ezdsp5535, его интересовал, прежде всего, многоканальный вывод. Ну а те, кто делает коммерческие разработки, тот информацией делиться не будет.
ig_z
QUOTE (nikkov @ Oct 4 2013, 15:39) *
Просто хочу доделать нормальную реализацию USB Audio. АВР32 не совсем для этого годен, поэтому выбрал для себя LPC. На данный момент ничего нет, кроме плат собственной разработки с LPC1837 и LPC4337, да китайского кита open4337

Спасибо, понятно. У меня тоже опен4337-с в полной комплектации.

QUOTE (nikkov @ Oct 4 2013, 15:39) *
Выбор стеков еще впереди, т.к. пока нет времени заняться программированием, да и жду выхода LPCOpen 2.


А что такого предполагается в LPCOpen 2, по сравнению с текущей версией?

QUOTE (nikkov @ Oct 4 2013, 15:39) *
Коммерческие драйверы для Windows от Thesycon гораздо лучше, так как это полноценные драйверы с поддержкой ASIO,

А как это выглядит с технической точки зрения? Стабильнее, меньше грузят систему, проще в настройке или еще что то?
nikkov
Цитата(ig_z @ Oct 4 2013, 20:51) *
А что такого предполагается в LPCOpen 2, по сравнению с текущей версией?

Больше примеров, меньше ошибок biggrin.gif .

Цитата(ig_z @ Oct 4 2013, 20:51) *
А как это выглядит с технической точки зрения? Стабильнее, меньше грузят систему, проще в настройке или еще что то?

Так как это полноценные драйверы, то они реализуют звуковое устройство и все программы Windows могут работать с ними. С моим же драйвером могут работать только те программы, которые поддерживают ASIO. Для остальных программ звукового устройства просто не существует.
Left Radio
Проясните каким образом хост увеличивает количество байт в посылке? Дело в том что при воспроизведении время от времени проскакивают слабозаметные щелчки, скорость выдачи байт я засинхронизировал, тут проблем нет, думаю не может быть причина в том, что теперь ведь посылки с хоста не равны 384 байт (это для 16/96), а при заполнении буфера, если посылка например 388 байт и она не умещается в конец буфера, то я ее режу на две, одну часть в конец, все что не влезло в начало. Разрезается естественно только по 2 байта(16), но может ли хост выдать нечетное количество байт, из-за чего и появляются щелчки? Буфер читает DMA по кругу.
nikkov
Цитата(Left Radio @ Oct 8 2013, 15:24) *
Проясните каким образом хост увеличивает количество байт в посылке? Дело в том что при воспроизведении время от времени проскакивают слабозаметные щелчки, скорость выдачи байт я засинхронизировал, тут проблем нет, думаю не может быть причина в том, что теперь ведь посылки с хоста не равны 384 байт (это для 16/96), а при заполнении буфера, если посылка например 388 байт и она не умещается в конец буфера, то я ее режу на две, одну часть в конец, все что не влезло в начало. Разрезается естественно только по 2 байта(16), но может ли хост выдать нечетное количество байт, из-за чего и появляются щелчки? Буфер читает DMA по кругу.

Драйвер USB Audio под Windows не слишком точно отслеживает изменение размера данных, т.е. относительно небольшие отклонения от нормального размера он просто не успевает отрабатывать. Поэтому в *-widget экспериментально подбирали ту дельту, на которое скачком изменялось значение передаваемое через FB EP. С той стратегией, что там сейчас работает проблем вроде нет, хотя на первых этапах были. Код там несложный для понимания, находится в файле uac1_device_audio_task.c
Left Radio
Спасибо, поизучаю, а буфер там циклический, точно так же по DMA отправляется в I2S?
nikkov
Цитата(Left Radio @ Oct 8 2013, 17:01) *
Спасибо, поизучаю, а буфер там циклический, точно так же по DMA отправляется в I2S?

Да, там циклический буфер из 2-х частей, в один пишется то, что принимается по USB, из другого читает DMA. Части лежат в памяти друг за другом. При равенстве скоростей приема и отдачи расстояние между указателем чтения и указателем записи должны быть равны размеру одной части. Если расстояние уменьшается или увеличивается, до идет коррекция размера пакета от хоста
Left Radio
Хм..., у меня абсолютно такой же алгоритм, разве что буфер общий и поэтому расстояние удерживается в половину буфера, ладно буду разбираться, спасибо еще раз.
maxis
Реализую всё тоже самое что и у автора, но только на другом чипе и HighSpeed. Может кто-нибудь подскажет почему после каждой записи фитбека происходит URB Sync Reset Pipe and Clear Stall?


Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.