Цитата(Dubov @ Aug 8 2012, 11:51)

требуется реализоывать следующий драйвер: по внешнему прерыванию считывается 16 байт данных по spi(обязательно с использованием DMA) иданные складываются в кольцевой буфер в самом драйвере. Пользовательское приложение должно раз в 100мс считывать из буфера блок данных, такого размера, чтобы обеспечить "непрерывность" данных в буфере.
При написании руководствуюсь книгой "Linux device drivers 3rd" но никак не пойму как проще реализовать сам буфер и механизм считывания куска данных(не всего буфера, а только данных фиксированного размера, причём с того места где остановились в прошлый раз).
В книге написано что можно сделать так:
char *buf;
buf = kmalloc(BUF_LEN, GFP_DMA);
но как фисать в такой буфер по кольцу(при достижении конца буфера записывать в начало)? и как потом считывать данные не всего буфера целиком, а кусками, запомитная место последнего чтения.
Реализуйте внутри драйвера обычный кольцевой буфер в который складывайте все что нужно по прерыванию + дма(размер буфера нужно сразу выбрать с запасом), при чтении из пространства пользователя пусть отдается только фрагмент нужного размера или 0 если нет нечего. Все переменные типа голова-хвост хранятся внутри драйвера.