]> rtime.felk.cvut.cz Git - sysless.git/blob - board/h8300/h8eurobot/libs/bspbase/bsp0hwinit.c
h8300: Port the newest bloader to h8eurobot board
[sysless.git] / board / h8300 / h8eurobot / libs / bspbase / bsp0hwinit.c
1 /* procesor H8S/2638 ver 1.1  */
2 #include <types.h>
3 #include <cpu_def.h>
4 #include <h8s2638h.h>
5 #include <system_def.h>
6 #include <string.h>
7 #include <boot_fn.h>
8
9 #ifdef XRAM_SUPPORT_ENABLED
10 #define FULL_XRAM_ADRBUS
11 #endif /*XRAM_SUPPORT_ENABLED*/
12 #define SMALL_ADRBUS 8
13
14 static void deb_led_out(char val)
15 {
16   if (val&1)
17     DEB_LED_ON(0);
18   else
19     DEB_LED_OFF(0);
20   if (val&2)
21     DEB_LED_ON(1);
22   else
23     DEB_LED_OFF(1);
24   if (val&4)
25     DEB_LED_ON(2);
26   else
27     DEB_LED_OFF(2);
28   if (val&8)
29     DEB_LED_ON(3);
30   else
31     DEB_LED_OFF(3);
32 }
33
34 /* Provided by linker script */
35 extern char __boot_fn_load;
36 extern char __boot_fn_start;
37 extern char __boot_fn_end;
38
39 static void relocate_boot_fn()
40 {
41   size_t reloc_size=&__boot_fn_end-&__boot_fn_start;
42
43   if(&__boot_fn_load != &__boot_fn_start) {
44     memcpy(&__boot_fn_start,&__boot_fn_load,reloc_size);
45   }
46 }
47
48 void _setup_board()
49 {
50   //int i, j;// POE-100
51
52 #if 1 /* registers setup */
53   /* Internal RAM enabled, advanced interrupt mode */
54   /* *SYS_SYSCR = 1*SYSCR_RAMEm | 1*SYSCR_INTM1m ; */
55
56   /* Remap 4kB of RAM from 0xffd000-0xffdfff to 0x0-0xfff */
57   /* *FLM_RAMER= 1*RAMER_RAMSm | 0&RAMER_RAMxm */
58   /* Sideefect - sets Flash software protection */
59
60   /* Enables access to flash control registers */
61   *IIC_SCRX |= SCRX_FLSHEm;
62
63   /* set shadow registers */
64   DIO_P1DDR_shadow=0;
65   DIO_P3DDR_shadow=0;
66   DIO_PADDR_shadow=0;
67   DIO_PEDDR_shadow=0;
68   DIO_PFDDR_shadow=0;
69   DIO_PJDDR_shadow=0;
70
71   DEB_LED_INIT();
72
73   relocate_boot_fn();
74
75   /* show something on debug leds */
76   deb_led_out(0);
77   FlWait(1*100000);
78
79 /*   SHADOW_REG_SET(DIO_P1DDR,0x03); /\* A20 and A21 are outputs *\/ */
80
81   *DIO_P3DR=0x09;       /* Inactive value of TxD0 and TxD1 has to be log 1 */
82   SHADOW_REG_SET(DIO_P3DDR,0x09); /* TxD0 and TxD1 to outputs */
83   *DIO_PADR=0x02;       /* Inactive value of TxD2 has to be log 1 */
84   SHADOW_REG_SET(DIO_PADDR,0x02); /* TxD0 and TxD1 to outputs */
85
86   /* Setup system clock oscilator */
87   /* PLL mode x4, */
88   /* *SYS_LPWRCR=2&LPWRCR_STCxm; */
89   /* PLL mode x2, */
90   /* *SYS_LPWRCR=1&LPWRCR_STCxm; */
91   {
92 #if (CPU_SYS_HZ != CPU_REF_HZ) && (CPU_SYS_HZ/2 != CPU_REF_HZ) && (CPU_SYS_HZ/4 != CPU_REF_HZ)
93 #error Wrong clock settings: CPU_SYS_HZ must be 1, 2 or 4 multiple of CPU_REF_HZ
94 #endif
95 #if CPU_SYS_HZ > 20000000
96 #error Wrong clock settings: CPU_SYS_HZ must be less or equal to 20000000
97 #endif
98     const char clkrat2stc[]={0,0/*1*/,1/*2*/,1,2/*4*/,2,2,2,3/*8*/};
99     *SYS_LPWRCR=LPWRCR_STCxm&(LPWRCR_STC0m*
100                               clkrat2stc[(CPU_SYS_HZ+CPU_REF_HZ/2)/CPU_REF_HZ]);
101   }
102   deb_led_out(1);
103   //FlWait(1*100000);
104
105   /* No clock disable, immediate change, busmaster high-speed */
106   *SYS_SCKCR=(0*SCKCR_PSTOPm)|(1*SCKCR_STCSm)|(0&SCKCR_SCKxm);
107   // POE-100
108 #if 0
109   /* Setup chipselect outputs CS4 CS5 CS6 */
110   *DIO_P7DR |=1|2|4;
111   SHADOW_REG_SET(DIO_P7DDR,1|2|4);
112 #else
113   // SHADOW_REG_SET(DIO_P7DDR,0); not on 2638
114 #endif
115
116   /* Setup chipselect outputs CS3 CS2 CS1 CS0 */
117   // *DIO_PGDR |=2|4|8|0x10; no on 2638
118 #if 0
119   SHADOW_REG_SET(DIO_PGDDR,2|4|8|0x10);
120 #else
121   // SHADOW_REG_SET(DIO_PGDDR,2|4); no on 2638
122 #endif
123
124 #if 0
125   /* setup chipselect 0 - FLASH */
126   *BUS_ABWCR&=~ABWCR_ABW0m;     /* 16 bit width */
127   *BUS_ASTCR&=~ASTCR_AST0m;     /* 2 states access */
128   //*BUS_ASTCR|=ASTCR_AST0m;    /* 3 states access EDK 2638 */
129   *BUS_WCRL&=~(WCRL_W01m|WCRL_W00m);/* 0 additional wait states */
130
131   /* setup chipselect 1 - XRAM */
132   *BUS_ABWCR&=~ABWCR_ABW1m;     /* 16 bit width */
133   *BUS_ASTCR&=~ASTCR_AST1m;     /* 2 states access */
134   *BUS_WCRL&=~(WCRL_W11m|WCRL_W10m);/* 0 additional wait states */
135
136   /* setup chipselect 2 - USB */
137   *BUS_ABWCR|=ABWCR_ABW2m;      /* 8 bit width */
138   *BUS_ASTCR|=ASTCR_AST2m;      /* 3 states access */
139   *BUS_WCRL&=~(WCRL_W21m|WCRL_W20m);/* 0 additional wait states */
140   *BUS_WCRL|=1*WCRL_W21m;       /* 0/1 additional wait state */
141
142   /* setup chipselect 3 - KBD */
143   *BUS_ABWCR|=ABWCR_ABW3m;      /* 8 bit width */
144   *BUS_ASTCR|=ASTCR_AST3m;      /* 3 states access */
145   *BUS_WCRL|=(WCRL_W31m|WCRL_W30m);/* 0 additional wait states */
146 #endif
147
148 #if 0
149   /* setup chipselect 4 - IDE */
150   *BUS_ABWCR&=~ABWCR_ABW4m;     /* 16 bit width */
151   *BUS_ASTCR|=ASTCR_AST4m;      /* 3 states access */
152   *BUS_WCRH&=~(WCRH_W41m|WCRH_W40m);/* 0 additional wait states */
153
154   /* setup chipselect 5 - IDE */
155   *BUS_ABWCR&=~ABWCR_ABW5m;     /* 16 bit width */
156   *BUS_ASTCR|=ASTCR_AST5m;      /* 3 states access */
157   *BUS_WCRH&=~(WCRH_W51m|WCRH_W50m);/* 0 additional wait states */
158
159   /* setup chipselect 6 - KL41 */
160   *BUS_ABWCR|=ABWCR_ABW6m;      /* 8 bit width */
161   *BUS_ASTCR|=ASTCR_AST6m;      /* 3 states access */
162   *BUS_WCRH=WCRH_W61m|WCRH_W60m;        /* 3 additional wait states */
163 #endif
164
165   deb_led_out(2);
166   //FlWait(1*100000);
167
168 #if 0
169   /*  cross cs wait| rd/wr wait    | no burst and DRAM */
170   *BUS_BCRH=0*BCRH_ICIS1m | 0*BCRH_ICIS0m;
171   /* release      | no DMAC buffer | no external wait */
172   *BUS_BCRL=0*BCRL_WDBEm; // 0*BCRL_BRLEm | 0*BCRL_WDBEm | 0*BCRL_WAITEm;  BRLE and WAITE not build in 2638
173   *DIO_PCDDR=0xff;              /* A0-A7 are outputs */
174 #ifndef SMALL_ADRBUS
175   *DIO_PBDDR=0xff;              /* A8-A15 are outputs */
176 #endif /*SMALL_ADRBUS*/
177 #ifndef FULL_XRAM_ADRBUS
178 #ifndef SMALL_ADRBUS
179   *SYS_PFCR=__val2mfld(PFCR_AExm,16-8); /* only 16 address lines */
180 #else /*SMALL_ADRBUS*/
181   *SYS_PFCR=__val2mfld(PFCR_AExm,SMALL_ADRBUS-8); /* only SMALL_ADRBUS address lines */
182 #endif /*SMALL_ADRBUS*/
183 #endif /* FULL_XRAM_ADRBUS */
184
185 #endif /* registers setup */
186
187   //FlWait(1*100000);
188
189 #ifdef FULL_XRAM_ADRBUS
190   /* Setup full 22 address lines */
191   *DIO_PADR|=0x0f;
192   *DIO_PADDR=0x0f;              /* A16-A19 are outputs */
193   /* number of address output signals */
194   *SYS_PFCR=__val2mfld(PFCR_AExm,22-8);
195 #endif /*FULL_XRAM_ADRBUS*/
196 #endif
197
198 }
199