#include <unistd.h>
#include <sys/types.h>
#include <sys/mman.h>
#include <stdio.h>
#include <fcntl.h>
#include <stdlib.h>
#include <string.h>

#include "ts_id.h"

unsigned int id_cpu() {
  FILE *cpuinfo;
  char infofilename[] = "/proc/cpuinfo";
  char procname[40];
  unsigned int success = 0, ret = 0;
  
  cpuinfo = fopen(infofilename, "r");
  success = (fscanf(cpuinfo, "Processor : %s", procname));
  fclose(cpuinfo);
  
  if (!success) {
    fprintf(stderr, "Error:  Failure to read /proc/cpuinfo.\n");
    } else {
    if(!strcmp(procname, "Arm920Tid(wb)")) ret = ARM920;
    if(!strcmp(procname, "ARM926EJ-S")) ret = ARM926;
    if(ret == 0) fprintf(stderr, "Error:  CPU not recognized.\n");
    }
  
  
  return ret;
  }

unsigned int id_ts_model() {
  unsigned int version, ret = 0, cpu_id = 0;
  volatile unsigned int *memptr;
  int devmem = open("/dev/mem", O_RDWR|O_SYNC);
  
  cpu_id = id_cpu();
  
  switch(cpu_id){
    case ARM920:
      memptr = (volatile unsigned int *)mmap(0, getpagesize(),
        PROT_READ|PROT_WRITE, MAP_SHARED, devmem, 0x22000000);
      version = *memptr & 0x7;  /* 7200 family model number is only 3 bits. */
      switch(version) {
        case 0:
          ret = 7200;
          break;
        case 1:
          ret = 7250;
          break;
        case 2:
          ret = 7260;
          break;
        case 3:
          ret = 7300;
          break;
        case 4:
          ret = 7400;
          break;
        }
      break;
    case ARM926:
      /* If we have more ARM926 relatives, we have to look at 0xE8000000 for the model */
      ret = 7800;
      break;
    default:
      ret = 0;
      fprintf(stderr, "Error, Unknown CPU.\n");
    }
  return ret;
  }


