Re[2]: MPC8308RM DMA
От: Harvat  
Дата: 23.04.19 04:37
Оценка:
Здравствуйте, 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 найти не удалось.
По этому и спросил тут.
Может у кого пример есть....
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.