#ifndef __MULTICORE_DMA_H__ #define __MULTICORE_DMA_H__ // // Смещения регистров DMA // // Внимание! Состав регистров у разных DMA может быть разный! // Совпадают всегда только первых 3 регистра! #define RG_DMA_CSR 0x00 #define RG_DMA_CP 0x04 #define RG_DMA_IR 0x08 #define RG_DMA_RUN 0x0C // // Регистр CSR для каналов DMA // // Состояние работы канала DMA #define F_DMA_RUN 0x00000001 // Направление передачи для каналов MEM_CH #define F_DMA_DIR 0x00000002 // Установка длины пачки #define F_DMA_WN(n) ((n) << 2) // Установка длины пачки #define F_DMA_EN64 0x00000040 // Запрет прерывания по запросу от порта при выключенном канале DMA(RUN=0) #define F_DMA_IPD 0x00000040 // Разрешение запуска DSP (для MEM_CH) #define F_DMA_START_DSP 0x00000080 // Режим модификация адреса регистра IR0 #define F_DMA_MODE 0x00000100 // Режим модификации адреса регистра IR1 #define F_DMA_2D 0x00000200 // Признак разрешения самоинициализации #define F_DMA_CHEN 0x00001000 // Маска прерывания при окончании передачи блока #define F_DMA_IM 0x00002000 // Признак завершения передачи блока данных #define F_DMA_END 0x00004000 // Признак завершения передачи цепочки блоков данных #define F_DMA_DONE 0x00008000 // Маска счетчика слов #define F_DMA_WCX_MASK 0xffff0000 // Установка счетчика слов #define F_DMA_WCX(n) ((n) << 16) // // Регистр OR для каналов DMA типа MEM_CH // // Приращение регистра IR0 (в словах) #define F_DMA_OR0(n) (n) // Приращение регистра IR1 (в словах) #define F_DMA_OR1(n) ((n) << 16) // // Элемент цепочки DMA // typedef struct __attribute__((__packed__)) _dma_params_t { uint32_t zero; // Неиспользуемое поле uint32_t ir; // Значение, загружаемое в IR uint32_t cp; // Значение, загружаемое в CP uint32_t csr; // Значение, загружаемое в CSR } dma_params_t; #endif