Deniskin_I 0 8 сентября, 2009 Опубликовано 8 сентября, 2009 · Жалоба Есть устройство в составе которого SAM7 - слэйв (AT91SAM7S256) и ARM9 - мастер под Линуксом (AT91RM9200). Оба эти процессора взаимодействуют по SPI. Проблема в том, что при обращени по SPI чаще чем раз в 1,5-2 секунды происходит перемешивание входных и выходных данных...такое ощущение что операционка не успевает отдать буфер приема и начинает туда засовывать данные для передачи... Вот собственно вся проблема, как решить и в чем дело то? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
vmp 0 8 сентября, 2009 Опубликовано 8 сентября, 2009 · Жалоба происходит перемешивание входных и выходных данных... Не работал с линуксом, но есть опыт с SAM9XE. Основные грабли возникают из-за того, что работа PDC (DMA) не обновляет кеш процессора. Поэтому нужно либо сбрасывать кеш вручную, либо располагать буфера, к которым может быть обращение по DMA, в некешируемой памяти. Как в линуксе - не знаю, надо смотреть исходники драйвера SPI, как они работают (через PDC или нет) и где лежат буфера. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Deniskin_I 0 8 сентября, 2009 Опубликовано 8 сентября, 2009 · Жалоба ...да...точно...драйвера посторены именно с использованием DMA, а выделение памяти происходит стандартной функцией ядра kmalloc... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
sasamy 0 8 сентября, 2009 Опубликовано 8 сентября, 2009 · Жалоба ...да...точно...драйвера посторены именно с использованием DMA, а выделение памяти происходит стандартной функцией ядра kmalloc... Если разработка на уровне ядра - можно выделить некэшируемый буфер (dma_alloc_coherent) и сообщить драйверу spi что буфер уже смапен (is_dma_mapped). Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Deniskin_I 0 9 сентября, 2009 Опубликовано 9 сентября, 2009 · Жалоба Если разработка на уровне ядра - можно выделить некэшируемый буфер (dma_alloc_coherent) и сообщить драйверу spi что буфер уже смапен (is_dma_mapped). в том то и дело что не хотелось бы лезть в ядро...если это конечно возможно... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться