Subversion Repositories Kolibri OS

Rev

Blame | Last modification | View Log | RSS feed

  1. #include "pxa255_TIMR.h"
  2. #include "mem.h"
  3.  
  4.  
  5. static void pxa255timrPrvRaiseLowerInts(Pxa255timr* timr){
  6.        
  7.         pxa255icInt(timr->ic, PXA255_I_TIMR0, (timr->OSSR & 1) != 0);
  8.         pxa255icInt(timr->ic, PXA255_I_TIMR1, (timr->OSSR & 2) != 0);
  9.         pxa255icInt(timr->ic, PXA255_I_TIMR2, (timr->OSSR & 4) != 0);
  10.         pxa255icInt(timr->ic, PXA255_I_TIMR3, (timr->OSSR & 8) != 0);
  11. }
  12.  
  13. static void pxa255timrPrvCheckMatch(Pxa255timr* timr, UInt8 idx){
  14.        
  15.         UInt8 v = 1UL << idx;
  16.        
  17.         if((timr->OSCR == timr->OSMR[idx]) && (timr->OIER & v)){
  18.                 timr->OSSR |= v;
  19.         }
  20. }
  21.  
  22. static void pxa255timrPrvUpdate(Pxa255timr* timr){
  23.        
  24.         pxa255timrPrvCheckMatch(timr, 0);
  25.         pxa255timrPrvCheckMatch(timr, 1);
  26.         pxa255timrPrvCheckMatch(timr, 2);
  27.         pxa255timrPrvCheckMatch(timr, 3);
  28. }
  29.  
  30. static Boolean pxa255timrPrvMemAccessF(void* userData, UInt32 pa, UInt8 size, Boolean write, void* buf){
  31.  
  32.         Pxa255timr* timr = userData;
  33.         UInt32 val = 0;
  34.        
  35.         if(size != 4) {
  36.                 err_str(__FILE__ ": Unexpected ");
  37.         //      err_str(write ? "write" : "read");
  38.         //      err_str(" of ");
  39.         //      err_dec(size);
  40.         //      err_str(" bytes to 0x");
  41.         //      err_hex(pa);
  42.         //      err_str("\r\n");
  43.                 return true;            //we do not support non-word accesses
  44.         }
  45.        
  46.         pa = (pa - PXA255_TIMR_BASE) >> 2;
  47.        
  48.         if(write){
  49.                 val = *(UInt32*)buf;
  50.                
  51.                 switch(pa){
  52.                         case 0:
  53.                         case 1:
  54.                         case 2:
  55.                         case 3:
  56.                                 timr->OSMR[pa] = val;
  57.                                 break;
  58.                        
  59.                         case 4:
  60.                                 timr->OSCR = val;
  61.                                 break;
  62.                        
  63.                         case 5:
  64.                                 timr->OSSR = timr->OSSR &~ val;
  65.                                 pxa255timrPrvRaiseLowerInts(timr);
  66.                                 break;
  67.                        
  68.                         case 6:
  69.                                 timr->OWER = val;
  70.                                 break;
  71.                        
  72.                         case 7:
  73.                                 timr->OIER = val;
  74.                                 pxa255timrPrvUpdate(timr);
  75.                                 pxa255timrPrvRaiseLowerInts(timr);
  76.                                 break;
  77.                 }
  78.         }
  79.         else{
  80.                 switch(pa){
  81.                         case 0:
  82.                         case 1:
  83.                         case 2:
  84.                         case 3:
  85.                                 val = timr->OSMR[pa];
  86.                                 break;
  87.                        
  88.                         case 4:
  89.                                 val = timr->OSCR;
  90.                                 break;
  91.                        
  92.                         case 5:
  93.                                 val = timr->OSSR;
  94.                                 break;
  95.                        
  96.                         case 6:
  97.                                 val = timr->OWER;
  98.                                 break;
  99.                        
  100.                         case 7:
  101.                                 val = timr->OIER;
  102.                                 break;
  103.                 }
  104.                 *(UInt32*)buf = val;
  105.         }
  106.        
  107.         return true;
  108. }
  109.  
  110.  
  111. Boolean pxa255timrInit(Pxa255timr* timr, ArmMem* physMem, Pxa255ic* ic){
  112.        
  113.         __mem_zero(timr, sizeof(Pxa255timr));
  114.         timr->ic = ic;
  115.         return memRegionAdd(physMem, PXA255_TIMR_BASE, PXA255_TIMR_SIZE, pxa255timrPrvMemAccessF, timr);
  116. }
  117.  
  118. void pxa255timrTick(Pxa255timr* timr){
  119.        
  120.         timr->OSCR++;
  121.         pxa255timrPrvUpdate(timr);
  122.         pxa255timrPrvRaiseLowerInts(timr);
  123. }
  124.