Здравствуйте, Zhendos, Вы писали:
Z>Здравствуйте, Harvat, Вы писали:
H>>Доброго времени суток.
H>>Подскажите как правильно использовать DMA на этом звере(MPC8308).
H>>Делаю так:
H>>H>> pMPC8308_D = (uint32_t*)mmap(0, 0x00100000, PROT_READ | PROT_WRITE , MAP_SHARED, hCPLD, CONFIG_SYS_IMMR);
H>> DMAC = (DMAC_str *)mmap(0, 0x001000, PROT_READ MAP_SHARED, hCPLD, CONFIG_SYS_IMMR + DMAC_str_Offset);
H>> TCD_ = (tcd_ctrl *)mmap(0, 0x001000, PROT_READ | PROT_WRITE, MAP_SHARED, hCPLD, CONFIG_SYS_IMMR + DMAC_str_Offset + 0x1000);
H>> char *pp = new char[100];
H>> memset(pp,0xFF,100);
TCD_->>>daddr = CONFIG_SYS_IMMR + DMAC_str_Offset;
TCD_->>>nbytes = 16;
TCD_->>>citer.citer = TCD_->biter.biter = 1;
TCD_->>>soff = 1;
TCD_->>>attr.ssize = 0;
TCD_->>>slast = 0;
TCD_->>>saddr = (uint32_t)pp;
TCD_->>>doff = 4;
TCD_->>>attr.dsize = 2;
TCD_->>>dlast_sga = -16;
TCD_->>>ccr.int_maj = 1;
TCD_->>>ccr.start = 1;
H>>
H>>Но в итоге , по выполнению этого кода, массив "pp" никак не меняется. Что делаю не так??
Z>Код довольно странный, вы работаете напрямую с железом или нет,
Z>используете MMU или нет?
Z>Судя по mmap используется виртуальная память и даже есть какая-то ОС или ее подобие,
Z>тогда `TCD_->>saddr = (uint32_t)pp;` это какая-та фигня, DMA контролер обычно с физическими адресами
Z>работает, почему ему виртуальный адрес передается, плюс вы уверены что выделенный блок с помощью new
Z>имеет правильно выравнивание? Плюс где "volatile"? Как компилятор поймет что все эти чтения и записи
Z>в память не стоит оптимизировать иными словами переупорядочить, половину выкинуть как ненужные и т.п.?
Да, работаю напрямую с железом. Стоит там Power PC e300 с урезанным линуксом.
MMU не использую.
volatile попробовал, но ничего не изменилось.
Собственно до этого я с DMA не работал, но примеров по этому MPC8308RM найти не удалось.
По этому и спросил тут.
Может у кого пример есть....