Real-time collaboration for Jupyter Notebooks, Linux Terminals, LaTeX, VS Code, R IDE, and more,
all in one place. Commercial Alternative to JupyterHub.
Real-time collaboration for Jupyter Notebooks, Linux Terminals, LaTeX, VS Code, R IDE, and more,
all in one place. Commercial Alternative to JupyterHub.
Path: blob/next/external/packages/bsp/sunxi-temp/mod_mmio.h
Views: 3959
#include <sys/mman.h>1#include <sys/types.h>2#include <sys/stat.h>3#include <errno.h>4#include <fcntl.h>5#include <unistd.h>6#include <string.h>7#include <stdlib.h>8#include <stdio.h>9#include <time.h>10#include <math.h>11#include <stdint.h>1213struct mmio {14unsigned long iobase; /* getpagesize() aligned, see mmap(2) */15unsigned long offset; /* additional offset from iobase */16unsigned long range; /* N * uint32_t read/write ops. */1718void *iomem;19size_t iosize;20int kmem; /* 0 - /dev/mem, 1 - /dev/kmem */21};2223void sysDelay_us(uint16_t us)24{25struct timespec usec;26usec.tv_sec = 0;27usec.tv_nsec = us*1000;28nanosleep(&usec,NULL);29}3031void sysDelay_ms(uint16_t ms)32{33struct timespec msec;34msec.tv_sec = 0;35msec.tv_nsec = ms*1000000;36nanosleep(&msec,NULL);37}3839static inline uint32_t readl(void *ptr)40{41uint32_t *data = ptr;42return *data;43}4445static inline void writel(uint32_t value, void *ptr)46{47uint32_t *data = ptr;48*data = value;49}5051uint32_t mmio_readl(const struct mmio *io, unsigned int offset)52{53void *addr;5455addr = io->iomem + io->offset + offset;5657return readl(addr);58}5960void mmio_writel(const struct mmio *io, unsigned int offset, uint32_t value)61{62void *addr;6364addr = io->iomem + io->offset + offset;65writel(value, addr);66}6768static void mmio_normalize(struct mmio *mo)69{70int npages = 0;7172mo->iobase += mo->offset;73mo->offset = mo->iobase & (getpagesize() - 1);74mo->iobase = mo->iobase & ~(getpagesize() - 1);7576npages += (mo->range * sizeof(uint32_t)) / getpagesize();77npages += 1;78mo->iosize = npages * getpagesize();79}8081static void mmio_init(struct mmio *mo)82{83char *device;84int iofd;8586if (!mo->kmem)87device = "/dev/mem";88else89device = "/dev/kmem";9091iofd = open(device, O_RDWR);92if (iofd < 0)93{94//ie_errno("open() failed");95printf("open failed\n");96exit(-1);97// TODO:98}99100mo->iomem = mmap(NULL, mo->iosize,101PROT_READ|PROT_WRITE,102MAP_SHARED,103iofd, mo->iobase);104105if (mo->iomem == MAP_FAILED)106{107printf("can't map\n");108exit(-1);109//die_errno("can't map @ %0lX", mo->iobase);110}111112close(iofd);113}114115int mmio_map(struct mmio *io, unsigned long base, size_t length)116{117memset(io, 0, sizeof(*io));118119io->iobase = base;120io->offset = 0;121io->range = length;122123mmio_normalize(io);124mmio_init(io);125126return 0;127}128129void mmio_unmap(struct mmio *io)130{131if (munmap(io->iomem, io->iosize))132{133exit(-1);134//die_errno("can't unmap @ %lX", io->iobase);135}136137memset(io, 0, sizeof(*io));138}139140unsigned long mmio_read(unsigned long iobase)141{142struct mmio io;143uint32_t rdata;144145mmio_map(&io, iobase, 0);146rdata = mmio_readl(&io, 0);147mmio_unmap(&io);148return rdata;149}150151unsigned long mmio_write(unsigned long iobase, unsigned long data2)152{153struct mmio io;154uint32_t data;155156mmio_map(&io, iobase, 0);157mmio_writel(&io, 0, data2);158data = mmio_readl(&io, 0);159mmio_unmap(&io);160if (data != data2)161return -1;162else163return 0;164}165166unsigned long mmio_write2(unsigned long iobase, unsigned long data2)167{168struct mmio io;169uint32_t data;170171mmio_map(&io, iobase, 0);172mmio_writel(&io, 0, data2);173data = mmio_readl(&io, 0);174mmio_unmap(&io);175if (data != data2)176return -1;177else178return 0;179}180181void * mmiof_init(unsigned long iobase)182{183struct mmio io1;184unsigned long offset;185// unsigned long iobase;186unsigned long range;187size_t iosize;188void *iomem;189// mmio_map(&io1, 0x18040000, 0);190191//memset(io1, 0, sizeof(*io1));192193// iobase = 0x18040000;194//offset = 0;195range = 0;196197// mmio_normalize(&io1);198int npages = 0;199200//iobase += offset;201offset = iobase & (getpagesize() - 1);202iobase = iobase & ~(getpagesize() - 1);203204npages += (range * sizeof(uint32_t)) / getpagesize();205npages += 1;206iosize = npages * getpagesize();207208//mmio_init(&io1);209char *device;210int iofd;211212device = "/dev/mem";213//device = "/dev/kmem";214215iofd = open(device, O_RDWR);216if (iofd < 0)217{218//ie_errno("open() failed");219printf("open failed\n");220exit(-1);221// TODO:222}223224iomem = mmap(NULL, iosize, PROT_READ|PROT_WRITE, MAP_SHARED, iofd, iobase);225226if (iomem == MAP_FAILED)227{228printf("can't map\n");229exit(-1);230//die_errno("can't map @ %0lX", mo->iobase);231}232233close(iofd);234return iomem;235236}237238unsigned long mmiof_read(void * iomem, unsigned long offset)239{240void *addr;241addr = iomem + offset;242unsigned long read_data = readl(addr);243return read_data;244}245246void mmiof_write(void * iomem, unsigned long offset, unsigned long value)247{248void *addr;249addr = iomem + offset;250uint32_t *data = addr;251*data = value;252}253254void mmiof_close(void * iomem)255{256if (munmap(iomem, 4096))257{258exit(-1);259//die_errno("can't unmap @ %lX", io->iobase);260}261}262263264265