All pastes #1022772 Raw Edit

Stuff

public c v1 · immutable
#1022772 ·published 2008-05-19 14:19 UTC
rendered paste body
#define _GNU_SOURCE#include <errno.h>#include <error.h>#include <fcntl.h>#include <stdint.h>#include <stdio.h>#include <stdlib.h>#include <string.h>#include <sys/mman.h>#include <sys/stat.h>#include <sys/types.h>#include <time.h>#include <unistd.h>/* CLOCK_CNTL_INDEX - RW - 32 bits - [IOReg,MMReg:0x8] */#define CLOCK_CNTL_INDEX	0x8#	define CLOCK_CNTL_INDEX__PLL_ADDR_MASK		0x3f#	define CLOCK_CNTL_INDEX__PLL_ADDR_SHIFT		0#	define CLOCK_CNTL_INDEX__PLL_WR_EN_MASK		0x1#	define CLOCK_CNTL_INDEX__PLL_WR_EN_SHIFT	7#	define CLOCK_CNTL_INDEX__PPLL_DIV_SEL_MASK	0x3#	define CLOCK_CNTL_INDEX__PPLL_DIV_SEL_SHIFT	8/* CLOCK_CNTL_DATA - RW - 32 bits - [IOReg,MMReg:0xC] */#define CLOCK_CNTL_DATA		0xc/* SCLK_CNTL - RW - 32 bits - CLKIND:0xD */#define SCLK_CNTL		0xd#define SCLK_CNTL__SCLK_SRC_SEL_MASK		0x7#define SCLK_CNTL__SCLK_SRC_SEL_SHIFT		0	/* ... *//* GA_SOFT_RESET - RW - 32 bits - [MMReg:0x429C] */#define GA_SOFT_RESET		0x429c/* RBBM_SOFT_RESET - RW - 32 bits - [IOReg,MMReg:0xF0] [MMReg:0xE48] */#define RBBM_SOFT_RESET		0xf0int32_t *reg_mem_map = NULL;int32_tr32 (int32_t index){  int32_t data;  data = reg_mem_map[index >> 2];  fprintf (stderr, "%s: INDEX=0x%08x DATA=0x%08x\n", __func__, index, data);  return data;}voidw32 (int32_t index, int32_t data){  fprintf (stderr, "%s: INDEX=0x%08x DATA=0x%08x\n", __func__, index, data);  reg_mem_map[index >> 2] = data;}int32_tR_CLOCK_CNTL (int32_t index){  int32_t data;  w32 (CLOCK_CNTL_INDEX,       ((index & CLOCK_CNTL_INDEX__PLL_ADDR_MASK) << CLOCK_CNTL_INDEX__PLL_ADDR_SHIFT) |       ((1 & CLOCK_CNTL_INDEX__PLL_WR_EN_MASK) << CLOCK_CNTL_INDEX__PLL_WR_EN_SHIFT) |       ((0 & CLOCK_CNTL_INDEX__PPLL_DIV_SEL_MASK) << CLOCK_CNTL_INDEX__PPLL_DIV_SEL_SHIFT));  data = r32 (CLOCK_CNTL_DATA);  fprintf (stderr, "%s: INDEX=0x%08x DATA=0x%08x\n", __func__, index, data);  return data;}voidW_CLOCK_CNTL (int32_t index, int32_t data){  fprintf (stderr, "%s: INDEX=0x%08x DATA=0x%08x\n", __func__, index, data);  w32 (CLOCK_CNTL_INDEX, ((index & CLOCK_CNTL_INDEX__PLL_ADDR_MASK) << CLOCK_CNTL_INDEX__PLL_ADDR_SHIFT) |       ((1 & CLOCK_CNTL_INDEX__PLL_WR_EN_MASK) << CLOCK_CNTL_INDEX__PLL_WR_EN_SHIFT) |       ((0 & CLOCK_CNTL_INDEX__PPLL_DIV_SEL_MASK) << CLOCK_CNTL_INDEX__PPLL_DIV_SEL_SHIFT));  w32 (CLOCK_CNTL_DATA, data);}intmain (int argc, char **argv){  int mem_fd;  /* FIXME: Memory at dfff0000 (64-bit, non-prefetchable) [size=64K] */  int reg_addr = 0xdfff0000;  int reg_len = 0x10000;  if ((mem_fd = open ("/dev/mem", O_RDWR)) < 0)    {      fprintf (stderr, "%s: %s:%d: %s\n", program_invocation_short_name,	       __FILE__, __LINE__, strerror (errno));      exit (EXIT_FAILURE);    }  if ((reg_mem_map =       mmap (NULL, reg_len, PROT_READ | PROT_WRITE, MAP_SHARED, mem_fd,	     reg_addr)) == MAP_FAILED)    {      fprintf (stderr, "%s: %s:%d: %s\n", program_invocation_short_name,	       __FILE__, __LINE__, strerror (errno));      exit (EXIT_FAILURE);    }#if 1  int32_t sclk_cntl;  struct timespec timespec_15ms = { 0, 15000000 };	/* 15 Milliseconds */  int i;  sclk_cntl = R_CLOCK_CNTL (SCLK_CNTL);  W_CLOCK_CNTL (SCLK_CNTL,		sclk_cntl & ~(SCLK_CNTL__SCLK_SRC_SEL_MASK <<			      SCLK_CNTL__SCLK_SRC_SEL_SHIFT));  nanosleep (&timespec_15ms, NULL);  w32 (GA_SOFT_RESET, 0x200);  nanosleep (&timespec_15ms, NULL);  for (i = 0; i < 16; i++)    {      w32 (RBBM_SOFT_RESET, /* FIXME */	   1 << 0 | 1 << 1 | 1 << 2 | 1 << 5 | 1 << 7 | 1 << 8 | 1 << 10 | 1	   << 11 | 1 << 12 | 1 << 13 | 1 << 14);      nanosleep (&timespec_15ms, NULL);    }  W_CLOCK_CNTL (SCLK_CNTL, sclk_cntl);#endif  if (munmap (reg_mem_map, reg_len) < 0)    {      fprintf (stderr, "%s: %s:%d: %s\n", program_invocation_short_name,	       __FILE__, __LINE__, strerror (errno));      exit (EXIT_FAILURE);    }  if (close (mem_fd) < 0)    {      fprintf (stderr, "%s: %s:%d: %s\n", program_invocation_short_name,	       __FILE__, __LINE__, strerror (errno));      exit (EXIT_FAILURE);    }  return 0;}