int debug_uart_init(struct mem_map *mem, physaddr_t base, size_t len) { struct region *r; struct uart *u; const char *sock = getenv("OLDLAND_UART_SOCK"); u = malloc(sizeof(*u)); assert(u); if (!sock) { u->fd = open("uart_tx.txt", O_WRONLY | O_CREAT | O_NONBLOCK, 0600); assert(u->fd >= 0); } else { struct sockaddr_un addr; int len; u->fd = socket(AF_UNIX, SOCK_STREAM, 0); assert(u->fd >= 0); addr.sun_family = AF_UNIX; strncpy(addr.sun_path, sock, sizeof(addr.sun_path)); addr.sun_path[sizeof(addr.sun_path) - 1] = '\0'; len = strlen(addr.sun_path) + sizeof(addr.sun_family); if (connect(u->fd, (struct sockaddr *)&addr, len) < 0) die("failed to connect to uart socket %s\n", sock); } r = mem_map_region_add(mem, base, len, &uart_io_ops, u); assert(r != NULL); return 0; }
int ram_init(struct mem_map *mem, physaddr_t base, size_t len, const char *init_contents) { struct region *r; void *ram; assert(mem != NULL); ram = mmap(NULL, len, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0); assert(ram != MAP_FAILED); r = mem_map_region_add(mem, base, len, &ram_io_ops, ram, MEM_MAPF_CACHEABLE); assert(r != NULL); if (init_contents) { ssize_t br; int fd = open(init_contents, O_RDONLY); assert(fd >= 0); br = read(fd, ram, len); assert(br >= 0); debug("read %zd bytes into RAM @%08x from %s\n", br, base, init_contents); close(fd); } return 0; }
int sdram_ctrl_init(struct mem_map *mem, physaddr_t base, size_t len) { struct region *r = mem_map_region_add(mem, base, len, &sdram_ctrl_ops, NULL, 0); assert(r != NULL); return 0; }
int rom_init(struct mem_map *mem, physaddr_t base, size_t len, const char *filename) { void *rom; struct region *r; int fd = open(filename, O_RDONLY); assert(fd >= 0); rom = mmap(NULL, len, PROT_READ, MAP_PRIVATE, fd, 0); assert(rom != MAP_FAILED); r = mem_map_region_add(mem, base, len, &rom_io_ops, rom, MEM_MAPF_CACHEABLE); assert(r != NULL); return 0; }
struct spimaster *spimaster_init(struct mem_map *mem, physaddr_t base, struct spislave **slaves, size_t nr_slaves) { struct region *r; struct spimaster *master; master = calloc(1, sizeof(*master)); assert(master); master->slaves = slaves; master->nr_slaves = nr_slaves; assert(nr_slaves <= sizeof(unsigned int) * 8); r = mem_map_region_add(mem, base, 16384, &spimaster_ops, master, 0); assert(r); return master; }