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