Vitaliy_ARM 0 27 июня, 2008 Опубликовано 27 июня, 2008 · Жалоба Вот решил создать отдельную тему. Работаю с процессором недавно. Написал драйвер для своего самописного стека. Функции драйвера: int Init(BYTE *pMacAddr); int CheckRx(); int TxData(DWORD *Buf, DWORD Len); int RxData(DWORD **Buf, DWORD *Len); Пока DMA настроен так: DMA передатчика работает в режиме массива дескрипторов и отправляет только один буфер. DMA приемника работает в режиме больших списков, и имеет некоторый кольцевой буфер. Функция CheckRx() определяет наличие принятого пакета по полю Status в дескрипторе вот так: int bfEmac::CheckRx(void) { if((RxDescBuf[RxConsumeIndex].StatusWord & RX_COMP) !=0) if(RxDescBuf[RxConsumeIndex].StatusWord & RX_OK) return 0; // Возвращаем 0, если пакет принят return -1; } Функция приема RxData() после обработки пакета инкрементирует RxConsumeIndex (который не может быть больше количества дескрипторов). И возвращает указатель на принятый буфер и его длину. Проблема: работает только тогда, когда один приемный дескриптор. Если дескрипторов больше одного, начинаются глюки, причем такие, как будто дма по списку не в перед идет, а назад, хотя по смыслу такого не может быть. Если кто уже писал что-то подобное, посоветуйте, как сделать корректное обнаружение принятого пакета. Привожу так же функцию приема: int bfEmac::RxData(DWORD **Buf, DWORD *Len) { // определяем указатель на принятый буфер pETH_FRAME_BUFFER pRxEframe = (pETH_FRAME_BUFFER)RxBuf[RxConsumeIndex]; // возвращаем указатель и длину принятых данных *Buf = (DWORD*)pRxEframe->Dest; *Len = ((RxDescBuf[RxConsumeIndex].StatusWord) & 0x7FF) + 2; // обнуляем статус (без этой операции дма не станет больше писать в этот буфер) RxDescBuf[RxConsumeIndex].StatusWord = 0; // инкрементируем смещение в массиве дескрипторов ++RxConsumeIndex; if(RxConsumeIndex >= RX_BUF_NUM) RxConsumeIndex = 0; return 0; } Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Vitaliy_ARM 0 29 июня, 2008 Опубликовано 29 июня, 2008 (изменено) · Жалоба Вопрос исчерпан. Была проблема сугубо лично моя. При инициализации дескрипторов статусы инициализировались вместо нужного дескриптора на статусы следующего дескриптора. Изменено 29 июня, 2008 пользователем Vitaliy_ARM Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться