]> rtime.felk.cvut.cz Git - can-usb1.git/blob - ulan/embedded/arch/mcs51/mach-msc1210/libs/flash/mcuflash.c
Initializing repo
[can-usb1.git] / ulan / embedded / arch / mcs51 / mach-msc1210 / libs / flash / mcuflash.c
1 #include "mcuflash.h"
2 #include "mcu_regs.h"
3
4 #ifdef SDCC
5 #ifndef SDCC_MODEL_LARGE
6 data char mscflash_fdata;
7 data char mscflash_fdm;
8 #endif /* SDCC_MODEL_LARGE */
9 #endif /*SDCC*/
10 bit ea,eai;
11
12 #ifdef SDCC
13 #ifndef SDCC_MODEL_LARGE
14 char __page_erase (int faddr, char fdata, char fdm) 
15 {
16   mscflash_fdata=fdata;
17   mscflash_fdm=fdm;
18   ea=EA,eai=EAI;
19   EA=0;EAI=0;   // Disable interrupts
20   _asm
21         mov  r7,dpl
22         mov  r6,dph
23         mov  a,_mscflash_fdata
24         mov  r5,a
25         mov  a,_mscflash_fdm
26         mov  r3,a
27         lcall 0xFFD7
28         mov  dpl,r7
29   _endasm;
30   EAI=eai;EA=ea;
31 }
32 #else
33 /* For large model
34  * vec   Allocated to stack - offset -4  (the push _bp taken into account)
35  * fnc Allocated to registers 
36  */
37 char __page_erase (int faddr, char fdata, char fdm) reentrant
38 {
39   ea=EA,eai=EAI;
40   EA=0;EAI=0;   // Disable interrupts
41   _asm
42         mov  r7,dpl
43         mov  r6,dph
44         mov  a,sp
45         add  a,#-4
46         mov  r0,a
47         mov  a,@r0
48         mov  r3,a
49         inc  r0
50         mov  a,@r0
51         mov  r5,a
52         lcall 0xFFD7
53         mov  dpl,r7
54   _endasm;
55   EAI=eai;EA=ea;
56 }
57 #endif /* SDCC_MODEL_LARGE */
58 #else /* SDCC */
59 char __page_erase (int faddr, char fdata, char fdm)
60 {
61   ea=EA,eai=EAI;
62   EA=0;EAI=0;   // Disable interrupts
63   #pragma asm
64         lcall 0xFFD7
65   #pragma endasm
66   EAI=eai;EA=ea;
67 }
68 #endif /* SDCC */
69
70
71 #ifdef SDCC
72 #ifndef SDCC_MODEL_LARGE
73 char __write_flash_chk (int faddr, char fdata, char fdm) 
74 {
75   mscflash_fdata=fdata;
76   mscflash_fdm=fdm;
77   ea=EA,eai=EAI;
78   EA=0;EAI=0;   // Disable interrupts
79   _asm
80         mov  r7,dpl
81         mov  r6,dph
82         mov  a,_mscflash_fdata
83         mov  r5,a
84         mov  a,_mscflash_fdm
85         mov  r3,a
86         lcall 0xFFDB
87         mov  dpl,r7
88   _endasm;
89   EAI=eai;EA=ea;
90 }
91 #else
92 /* For large model
93  * vec   Allocated to stack - offset -4  (the push _bp taken into account)
94  * fnc Allocated to registers 
95  */
96 char __write_flash_chk (int faddr, char fdata, char fdm) reentrant
97 {
98   ea=EA,eai=EAI;
99   EA=0;EAI=0;   // Disable interrupts
100   _asm
101         mov  r7,dpl
102         mov  r6,dph
103         mov  a,sp
104         add  a,#-4
105         mov  r0,a
106         mov  a,@r0
107         mov  r3,a
108         inc  r0
109         mov  a,@r0
110         mov  r5,a
111         lcall 0xFFDB
112         mov  dpl,r7
113   _endasm;
114   EAI=eai;EA=ea;
115 }
116 #endif /* SDCC_MODEL_LARGE */
117 #else /* SDCC */
118 char __write_flash_chk (int faddr, char fdata, char fdm) 
119 {
120   ea=EA,eai=EAI;
121   EA=0;EAI=0;   // Disable interrupts
122   #pragma asm
123         call 0FFDBH
124   #pragma endasm
125   EAI=eai;EA=ea;
126 }
127 #endif /* SDCC */
128
129 int flash_erase(void *base,int size) {
130   size=size-((unsigned int)base&0x7f);
131   base=(xdata uint8_t*)((unsigned int)base&0xFF80);
132   while (size) {
133     page_erase ((unsigned int)base, 0xff, MSC_FPM);
134     base=(uint8_t *)base+0x80;
135     size-=0x80;
136   }
137   return 0;
138 }
139
140 int flash_copy(void *des,const void *src,int len) {
141   while(len) {
142     write_flash_chk ((unsigned int)des, *(uint8_t *)src, MSC_FPM);
143     src=(uint8_t *)src+1;
144     des=(uint8_t *)des+1; 
145     len--;
146   }
147   return len;
148 }
149
150 int flash_flush(void)
151 {
152   return 0;
153 }