3 #if CONFIG_HAL_BOARD_SUBTYPE == HAL_BOARD_SUBTYPE_LINUX_NAVIO || \ 4 CONFIG_HAL_BOARD_SUBTYPE == HAL_BOARD_SUBTYPE_LINUX_ERLEBRAIN2 || \ 5 CONFIG_HAL_BOARD_SUBTYPE == HAL_BOARD_SUBTYPE_LINUX_BH || \ 6 CONFIG_HAL_BOARD_SUBTYPE == HAL_BOARD_SUBTYPE_LINUX_DARK || \ 7 CONFIG_HAL_BOARD_SUBTYPE == HAL_BOARD_SUBTYPE_LINUX_PXFMINI 20 #include <sys/types.h> 29 #define debug(fmt, args ...) do { fprintf(stderr,"[RCInput_RPI]: %s:%d: " fmt, __FUNCTION__, __LINE__, ## args); } while (0) 31 #define debug(fmt, args ...) 35 #define RCIN_RPI_BUFFER_LENGTH 8 36 #define RCIN_RPI_SAMPLE_FREQ 500 37 #define RCIN_RPI_DMA_CHANNEL 0 38 #define RCIN_RPI_MAX_COUNTER 1300 39 #if CONFIG_HAL_BOARD_SUBTYPE == HAL_BOARD_SUBTYPE_LINUX_BH 40 #define PPM_INPUT_RPI RPI_GPIO_5 41 #elif CONFIG_HAL_BOARD_SUBTYPE == HAL_BOARD_SUBTYPE_LINUX_NAVIO 42 #define PPM_INPUT_RPI NAVIO_GPIO_PPM_IN 43 #define PAGE_SIZE (4*1024) 45 #define PPM_INPUT_RPI RPI_GPIO_4 47 #define RCIN_RPI_MAX_SIZE_LINE 50 50 #define RCIN_RPI_RPI1_DMA_BASE 0x20007000 51 #define RCIN_RPI_RPI1_CLK_BASE 0x20101000 52 #define RCIN_RPI_RPI1_PCM_BASE 0x20203000 54 #define RCIN_RPI_RPI2_DMA_BASE 0x3F007000 55 #define RCIN_RPI_RPI2_CLK_BASE 0x3F101000 56 #define RCIN_RPI_RPI2_PCM_BASE 0x3F203000 58 #define RCIN_RPI_GPIO_LEV0_ADDR 0x7e200034 59 #define RCIN_RPI_DMA_LEN 0x1000 60 #define RCIN_RPI_CLK_LEN 0xA8 61 #define RCIN_RPI_PCM_LEN 0x24 62 #define RCIN_RPI_TIMER_BASE 0x7e003004 64 #define RCIN_RPI_DMA_SRC_INC (1<<8) 65 #define RCIN_RPI_DMA_DEST_INC (1<<4) 66 #define RCIN_RPI_DMA_NO_WIDE_BURSTS (1<<26) 67 #define RCIN_RPI_DMA_WAIT_RESP (1<<3) 68 #define RCIN_RPI_DMA_D_DREQ (1<<6) 69 #define RCIN_RPI_DMA_PER_MAP(x) ((x)<<16) 70 #define RCIN_RPI_DMA_END (1<<1) 71 #define RCIN_RPI_DMA_RESET (1<<31) 72 #define RCIN_RPI_DMA_INT (1<<2) 74 #define RCIN_RPI_DMA_CS (0x00/4) 75 #define RCIN_RPI_DMA_CONBLK_AD (0x04/4) 76 #define RCIN_RPI_DMA_DEBUG (0x20/4) 78 #define RCIN_RPI_PCM_CS_A (0x00/4) 79 #define RCIN_RPI_PCM_FIFO_A (0x04/4) 80 #define RCIN_RPI_PCM_MODE_A (0x08/4) 81 #define RCIN_RPI_PCM_RXC_A (0x0c/4) 82 #define RCIN_RPI_PCM_TXC_A (0x10/4) 83 #define RCIN_RPI_PCM_DREQ_A (0x14/4) 84 #define RCIN_RPI_PCM_INTEN_A (0x18/4) 85 #define RCIN_RPI_PCM_INT_STC_A (0x1c/4) 86 #define RCIN_RPI_PCM_GRAY (0x20/4) 88 #define RCIN_RPI_PCMCLK_CNTL 38 89 #define RCIN_RPI_PCMCLK_DIV 39 94 using namespace Linux;
112 uint32_t bus = version == 1 ? 0x40000000 : 0xC0000000;
120 if ((fdMem =
open(
"/dev/mem", O_RDWR | O_SYNC | O_CLOEXEC)) < 0) {
121 fprintf(stderr,
"Failed to open /dev/mem\n");
125 if ((file =
open(
"/proc/self/pagemap", O_RDWR | O_SYNC | O_CLOEXEC)) < 0) {
126 fprintf(stderr,
"Failed to open /proc/self/pagemap\n");
131 offset = mmap(0,
_page_count *
PAGE_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED | MAP_ANONYMOUS | MAP_NORESERVE | MAP_LOCKED, -1, 0);
132 lseek(file, ((uintptr_t)offset) / PAGE_SIZE * 8, SEEK_SET);
136 _virt_pages[i] = mmap(0, PAGE_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED | MAP_ANONYMOUS | MAP_NORESERVE | MAP_LOCKED, -1, 0);
137 if (::
read(file, &pageInfo, 8) < 8) {
138 fprintf(stderr,
"Failed to read pagemap\n");
147 _virt_pages[i] = mmap(
_virt_pages[i], PAGE_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED | MAP_FIXED | MAP_NORESERVE | MAP_LOCKED, fdMem, ((uintptr_t)
_phys_pages[i] & (version == 1 ? 0xFFFFFFFF : ~bus)));
167 return (uint8_t *)pages[(uint32_t)addr / 4096] + addr % 4096;
178 if ((uintptr_t)
_phys_pages[i] == (((uintptr_t)phys_addr) & 0xFFFFF000)) {
179 return (
void *)((uintptr_t)
_virt_pages[i] + (phys_addr & 0xFFF));
191 if ((uintptr_t) pages[i] == (addr & 0xFFFFF000) ) {
201 if (write_addr > read_addr) {
202 return (write_addr - read_addr);
220 }
else if (version == 2) {
230 int fd =
open(
"/dev/mem", O_RDWR | O_CLOEXEC);
234 printf(
"Failed to open /dev/mem: %m\n");
237 vaddr = mmap(
nullptr, len, PROT_READ | PROT_WRITE, MAP_SHARED, fd, base);
238 if (vaddr == MAP_FAILED) {
239 printf(
"rpio-pwm: Failed to map peripheral at 0x%08x: %m\n", base);
250 (*cbp)->src = source;
252 (*cbp)->length = length;
253 (*cbp)->next = next_cb;
254 (*cbp)->stride = stride;
273 uint32_t phys_fifo_addr;
278 phys_fifo_addr = ((pcm_base + 0x04) & 0x00FFFFFF) | 0x7e000000;
298 cbp_curr = (
dma_cb_t *)con_blocks->get_page(con_blocks->_virt_pages, cbp);
301 (uintptr_t)circle_buffer->get_page(circle_buffer->_phys_pages, dest),
304 (uintptr_t)con_blocks->get_page(con_blocks->_phys_pages,
312 cbp_curr = (
dma_cb_t *)con_blocks->get_page(con_blocks->_virt_pages, cbp);
314 (uintptr_t)circle_buffer->get_page(circle_buffer->_phys_pages, dest),
317 (uintptr_t)con_blocks->get_page(con_blocks->_phys_pages,
327 cbp_curr = (
dma_cb_t *)con_blocks->get_page(con_blocks->_virt_pages, cbp);
332 (uintptr_t)con_blocks->get_page(con_blocks->_phys_pages,
339 ((
dma_cb_t *)con_blocks->get_page(con_blocks->_virt_pages, cbp))->next = (uintptr_t)con_blocks->get_page(con_blocks->_phys_pages, 0);
379 dma_reg[
RCIN_RPI_DMA_CONBLK_AD | RCIN_RPI_DMA_CHANNEL << 8] = reinterpret_cast<uintptr_t>(con_blocks->get_page(con_blocks->_phys_pages, 0));
388 struct sigaction sa, sa_old;
390 memset(&sa_old, 0,
sizeof(sa));
391 memset(&sa, 0,
sizeof(sa));
394 sa.sa_handler = SIG_IGN;
395 sigaction(SIGWINCH, &sa,
nullptr);
396 sigaction(SIGTTOU, &sa,
nullptr);
397 sigaction(SIGTTIN, &sa,
nullptr);
404 for (
int i = 0; i < NSIG; i++) {
405 sigaction(i,
nullptr, &sa_old);
407 if (sa_old.sa_handler ==
nullptr) {
409 sigaction(i, &sa,
nullptr);
416 circle_buffer{
nullptr},
451 #if CONFIG_HAL_BOARD_SUBTYPE == HAL_BOARD_SUBTYPE_LINUX_ERLEBRAIN2 498 debug(
"DMA sampling stopped, restarting...\n");
505 for (
int j = 1; j >= -1; j--) {
526 for (; counter > 0x40; counter--) {
int printf(const char *fmt,...)
int open(const char *pathname, int flags)
POSIX Open a file with integer mode flags.
uint32_t get_page_count() const
void * get_virt_addr(const uint32_t phys_addr) const
void * get_page(void **pages, const uint32_t addr) const
void * calloc(size_t nmemb, size_t size)
virtual void mode(uint8_t output)=0
virtual void delay(uint16_t ms)=0
ssize_t read(int fd, void *buf, size_t count)
POSIX read count bytes from *buf to fileno fd.
int close(int fileno)
POSIX Close a file with fileno handel.
virtual AP_HAL::DigitalSource * channel(uint16_t n)=0
uint32_t get_offset(void **pages, const uint32_t addr) const
uint32_t bytes_available(const uint32_t read_addr, const uint32_t write_addr) const
off_t lseek(int fileno, off_t position, int whence)
POSIX seek to file position.
int get_rpi_version() const
static UtilRPI * from(AP_HAL::Util *util)
virtual void delay_microseconds(uint16_t us)=0
int fprintf(FILE *fp, const char *fmt,...)
fprintf character write function
void panic(const char *errormsg,...) FMT_PRINTF(1
AP_HAL::Scheduler * scheduler