Цитата(alexPec @ Nov 21 2012, 14:04)

Почему максимум 0xff00? Да ХЗ, не задумывался, может с большими разрядностями счетчиков (а там похоже 16) скорость просаживается, или еще какие проблемы. Вобщем, раз написано так- так и делал.
Я имел в виду, что в доке такую цифру не нашел
Ну вроде начинает получаться:
1. память под дескрипторы и данныеКод
alt_sgdma_descriptor *desc = (alt_sgdma_descriptor *) DESCRIPTOR_MEMORY_BASE;
unsigned char* pkt = MEM_RX_BASE
2. создаю дескрипторыКод
alt_avalon_sgdma_register_callback(sgdma_rx_dev,(alt_avalon_sgdma_callback)&tse_sgdmaRx_isr,(alt_u16)ALTERA_AVALON_SGDMA_CONTROL_IE_DESC_COMPLETED_MSK | ALTERA_AVALON_SGDMA_CONTROL_IE_GLOBAL_MSK,sgdma_rx_dev);
alt_u32 *uncached_packet_payload;
uncached_packet_payload = pkt; //(void *)alt_remap_cached ((volatile void*) pkt, 4);
alt_avalon_sgdma_construct_stream_to_mem_desc(
(alt_sgdma_descriptor *) &desc[ALTERA_TSE_FIRST_RX_SGDMA_DESC_OFST], // descriptor I want to work with
(alt_sgdma_descriptor *) &desc[ALTERA_TSE_SECOND_RX_SGDMA_DESC_OFST], // pointer to "next"
uncached_packet_payload, // starting write_address
0, // read until EOP
0);
while ( (IORD_ALTERA_AVALON_SGDMA_STATUS(S_SGDMA_RX_BASE) & ALTERA_AVALON_SGDMA_STATUS_BUSY_MSK) );
uncached_packet_payload = pkt+(256);
alt_avalon_sgdma_construct_stream_to_mem_desc(
(alt_sgdma_descriptor *) &desc[ALTERA_TSE_SECOND_RX_SGDMA_DESC_OFST], // descriptor I want to work with
(alt_sgdma_descriptor *) &desc[ALTERA_TSE_FIRST_RX_SGDMA_DESC_OFST], // pointer to "next"
(uncached_packet_payload), // starting write_address
0, // read until EOP
0);
3. Запускаю последний созданный дескрипторКод
IOWR_ALTERA_AVALON_SGDMA_CONTROL(S_SGDMA_RX_BASE, ALTERA_AVALON_SGDMA_CONTROL_PARK_MSK);
desc[ALTERA_TSE_FIRST_RX_SGDMA_DESC_OFST].control=128; //выставляю OWNED_BY_HW для первого дескриптора
while ( (IORD_ALTERA_AVALON_SGDMA_STATUS(S_SGDMA_RX_BASE) & ALTERA_AVALON_SGDMA_STATUS_BUSY_MSK) );
alt_avalon_sgdma_do_async_transfer(sgdma_rx_dev, &desc[ALTERA_TSE_SECOND_RX_SGDMA_DESC_OFST]);
условие на прерываниеКод
#define ALTERA_TSE_SGDMA_INTR_MASK ALTERA_AVALON_SGDMA_CONTROL_IE_CHAIN_COMPLETED_MSK | ALTERA_AVALON_SGDMA_CONTROL_IE_GLOBAL_MSK |
ALTERA_AVALON_SGDMA_CONTROL_IE_EOP_ENCOUNTERED_MSK |
ALTERA_AVALON_SGDMA_CONTROL_IE_ERROR_MSK |
ALTERA_AVALON_SGDMA_CONTROL_IE_DESC_COMPLETED_MSK
В прерывании проверяю ошибки, статусы. в конце делаю
Код
if(n_desc==0)
{
t2=alt_avalon_sgdma_do_async_transfer(sgdma_rx_dev, &desc[ALTERA_TSE_FIRST_RX_SGDMA_DESC_OFST]);
n_desc=1;
}
else
{
alt_avalon_sgdma_do_async_transfer(sgdma_rx_dev, &desc[ALTERA_TSE_SECOND_RX_SGDMA_DESC_OFST]);
n_desc=0;
}
Все работает. Но мне теперь нужно убрать прерывание и что бы SGDMA молотил поток сам по себе.
Убираю..., в результате выполняется один дескриптор (п.3) и все, дальше ничего
Как их зациклить друг на друга в бесконечном цикле?