Revision 4a1e6bea
b/hw/axis_dev88.c | ||
---|---|---|
84 | 84 |
&nand_writel, |
85 | 85 |
}; |
86 | 86 |
|
87 |
#define RW_PA_DOUT 0 |
|
88 |
#define R_PA_DIN 1 |
|
89 |
#define RW_PA_OE 2 |
|
90 |
struct gpio_state_t |
|
87 |
|
|
88 |
struct tempsensor_t |
|
89 |
{ |
|
90 |
unsigned int shiftreg; |
|
91 |
unsigned int count; |
|
92 |
enum { |
|
93 |
ST_OUT, ST_IN, ST_Z |
|
94 |
} state; |
|
95 |
|
|
96 |
uint16_t regs[3]; |
|
97 |
}; |
|
98 |
|
|
99 |
static void tempsensor_clkedge(struct tempsensor_t *s, |
|
100 |
unsigned int clk, unsigned int data_in) |
|
101 |
{ |
|
102 |
D(printf("%s clk=%d state=%d sr=%x\n", __func__, |
|
103 |
clk, s->state, s->shiftreg)); |
|
104 |
if (s->count == 0) { |
|
105 |
s->count = 16; |
|
106 |
s->state = ST_OUT; |
|
107 |
} |
|
108 |
switch (s->state) { |
|
109 |
case ST_OUT: |
|
110 |
/* Output reg is clocked at negedge. */ |
|
111 |
if (!clk) { |
|
112 |
s->count--; |
|
113 |
s->shiftreg <<= 1; |
|
114 |
if (s->count == 0) { |
|
115 |
s->shiftreg = 0; |
|
116 |
s->state = ST_IN; |
|
117 |
s->count = 16; |
|
118 |
} |
|
119 |
} |
|
120 |
break; |
|
121 |
case ST_Z: |
|
122 |
if (clk) { |
|
123 |
s->count--; |
|
124 |
if (s->count == 0) { |
|
125 |
s->shiftreg = 0; |
|
126 |
s->state = ST_OUT; |
|
127 |
s->count = 16; |
|
128 |
} |
|
129 |
} |
|
130 |
break; |
|
131 |
case ST_IN: |
|
132 |
/* Indata is sampled at posedge. */ |
|
133 |
if (clk) { |
|
134 |
s->count--; |
|
135 |
s->shiftreg <<= 1; |
|
136 |
s->shiftreg |= data_in & 1; |
|
137 |
if (s->count == 0) { |
|
138 |
D(printf("%s cfgreg=%x\n", __func__, s->shiftreg)); |
|
139 |
s->regs[0] = s->shiftreg; |
|
140 |
s->state = ST_OUT; |
|
141 |
s->count = 16; |
|
142 |
|
|
143 |
if ((s->regs[0] & 0xff) == 0) { |
|
144 |
/* 25 degrees celcius. */ |
|
145 |
s->shiftreg = 0x0b9f; |
|
146 |
} else if ((s->regs[0] & 0xff) == 0xff) { |
|
147 |
/* Sensor ID, 0x8100 LM70. */ |
|
148 |
s->shiftreg = 0x8100; |
|
149 |
} else |
|
150 |
printf("Invalid tempsens state %x\n", s->regs[0]); |
|
151 |
} |
|
152 |
} |
|
153 |
break; |
|
154 |
} |
|
155 |
} |
|
156 |
|
|
157 |
|
|
158 |
#define RW_PA_DOUT 0x00 |
|
159 |
#define R_PA_DIN 0x01 |
|
160 |
#define RW_PA_OE 0x02 |
|
161 |
#define RW_PD_DOUT 0x10 |
|
162 |
#define R_PD_DIN 0x11 |
|
163 |
#define RW_PD_OE 0x12 |
|
164 |
|
|
165 |
static struct gpio_state_t |
|
91 | 166 |
{ |
92 | 167 |
struct nand_state_t *nand; |
168 |
struct tempsensor_t tempsensor; |
|
93 | 169 |
uint32_t regs[0x5c / 4]; |
94 | 170 |
} gpio_state; |
95 | 171 |
|
... | ... | |
107 | 183 |
/* Encode pins from the nand. */ |
108 | 184 |
r |= s->nand->rdy << 7; |
109 | 185 |
break; |
186 |
case R_PD_DIN: |
|
187 |
r = s->regs[RW_PD_DOUT] & s->regs[RW_PD_OE]; |
|
188 |
|
|
189 |
/* Encode temp sensor pins. */ |
|
190 |
r |= (!!(s->tempsensor.shiftreg & 0x10000)) << 4; |
|
191 |
break; |
|
192 |
|
|
110 | 193 |
default: |
111 | 194 |
r = s->regs[addr]; |
112 | 195 |
break; |
... | ... | |
131 | 214 |
|
132 | 215 |
s->regs[addr] = value; |
133 | 216 |
break; |
217 |
|
|
218 |
case RW_PD_DOUT: |
|
219 |
/* Temp sensor clk. */ |
|
220 |
if ((s->regs[addr] ^ value) & 2) |
|
221 |
tempsensor_clkedge(&s->tempsensor, !!(value & 2), |
|
222 |
!!(value & 16)); |
|
223 |
s->regs[addr] = value; |
|
224 |
break; |
|
225 |
|
|
134 | 226 |
default: |
135 | 227 |
s->regs[addr] = value; |
136 | 228 |
break; |
... | ... | |
194 | 286 |
|
195 | 287 |
|
196 | 288 |
/* Attach a NAND flash to CS1. */ |
197 |
nand_state.nand = nand_init(NAND_MFR_STMICRO, 0xf1);
|
|
289 |
nand_state.nand = nand_init(NAND_MFR_STMICRO, 0x39);
|
|
198 | 290 |
nand_regs = cpu_register_io_memory(0, nand_read, nand_write, &nand_state); |
199 | 291 |
cpu_register_physical_memory(0x10000000, 0x05000000, nand_regs); |
200 | 292 |
|
201 | 293 |
gpio_state.nand = &nand_state; |
202 | 294 |
gpio_regs = cpu_register_io_memory(0, gpio_read, gpio_write, &gpio_state); |
203 |
cpu_register_physical_memory(0x3001a000, 0x1c, gpio_regs);
|
|
295 |
cpu_register_physical_memory(0x3001a000, 0x5c, gpio_regs);
|
|
204 | 296 |
|
205 | 297 |
|
206 | 298 |
pic = etraxfs_pic_init(env, 0x3001c000); |
Also available in: Unified diff