Re: MPC8308RM DMA
От: Zhendos  
Дата: 22.04.19 13:55
Оценка:
Здравствуйте, 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" никак не меняется. Что делаю не так??

Код довольно странный, вы работаете напрямую с железом или нет,
используете MMU или нет?

Судя по mmap используется виртуальная память и даже есть какая-то ОС или ее подобие,
тогда `TCD_->>saddr = (uint32_t)pp;` это какая-та фигня, DMA контролер обычно с физическими адресами
работает, почему ему виртуальный адрес передается, плюс вы уверены что выделенный блок с помощью new
имеет правильно выравнивание? Плюс где "volatile"? Как компилятор поймет что все эти чтения и записи
в память не стоит оптимизировать иными словами переупорядочить, половину выкинуть как ненужные и т.п.?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.