Commit d361be2566e01f59d49f8102a5af2820cbaf8e73

Authored by balrog
1 parent 57575058

pflash_cfi01: add Single Byte Program (Jean-Christophe PLAGNIOL-VILLARD).

Signed-off-by: Jean-Christophe PLAGNIOL-VILLARD <plagnioj@jcrosoft.com>
Signed-off-by: Andrzej Zaborowski <andrew.zaborowski@intel.com>


git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@5904 c046a42c-6fe2-441c-8c8c-71466251a162
Showing 1 changed file with 53 additions and 34 deletions
hw/pflash_cfi01.c
... ... @@ -194,6 +194,47 @@ static void pflash_update(pflash_t *pfl, int offset,
194 194 }
195 195 }
196 196  
  197 +static void inline pflash_data_write(pflash_t *pfl, target_ulong offset,
  198 + uint32_t value, int width)
  199 +{
  200 + uint8_t *p = pfl->storage;
  201 +
  202 + DPRINTF("%s: block write offset " TARGET_FMT_lx
  203 + " value %x counter " TARGET_FMT_lx "\n",
  204 + __func__, offset, value, pfl->counter);
  205 + switch (width) {
  206 + case 1:
  207 + p[offset] = value;
  208 + pflash_update(pfl, offset, 1);
  209 + break;
  210 + case 2:
  211 +#if defined(TARGET_WORDS_BIGENDIAN)
  212 + p[offset] = value >> 8;
  213 + p[offset + 1] = value;
  214 +#else
  215 + p[offset] = value;
  216 + p[offset + 1] = value >> 8;
  217 +#endif
  218 + pflash_update(pfl, offset, 2);
  219 + break;
  220 + case 4:
  221 +#if defined(TARGET_WORDS_BIGENDIAN)
  222 + p[offset] = value >> 24;
  223 + p[offset + 1] = value >> 16;
  224 + p[offset + 2] = value >> 8;
  225 + p[offset + 3] = value;
  226 +#else
  227 + p[offset] = value;
  228 + p[offset + 1] = value >> 8;
  229 + p[offset + 2] = value >> 16;
  230 + p[offset + 3] = value >> 24;
  231 +#endif
  232 + pflash_update(pfl, offset, 4);
  233 + break;
  234 + }
  235 +
  236 +}
  237 +
197 238 static void pflash_write (pflash_t *pfl, target_ulong offset, uint32_t value,
198 239 int width)
199 240 {
... ... @@ -221,6 +262,10 @@ static void pflash_write (pflash_t *pfl, target_ulong offset, uint32_t value,
221 262 switch (cmd) {
222 263 case 0x00: /* ??? */
223 264 goto reset_flash;
  265 + case 0x10: /* Single Byte Program */
  266 + case 0x40: /* Single Byte Program */
  267 + DPRINTF(stderr, "%s: Single Byte Program\n", __func__);
  268 + break;
224 269 case 0x20: /* Block erase */
225 270 p = pfl->storage;
226 271 offset &= ~(pfl->sector_len - 1);
... ... @@ -262,6 +307,13 @@ static void pflash_write (pflash_t *pfl, target_ulong offset, uint32_t value,
262 307 return;
263 308 case 1:
264 309 switch (pfl->cmd) {
  310 + case 0x10: /* Single Byte Program */
  311 + case 0x40: /* Single Byte Program */
  312 + DPRINTF("%s: Single Byte Program\n", __func__);
  313 + pflash_data_write(pfl, offset, value, width);
  314 + pfl->status |= 0x80; /* Ready! */
  315 + pfl->wcycle = 0;
  316 + break;
265 317 case 0x20: /* Block erase */
266 318 case 0x28:
267 319 if (cmd == 0xd0) { /* confirm */
... ... @@ -306,40 +358,7 @@ static void pflash_write (pflash_t *pfl, target_ulong offset, uint32_t value,
306 358 case 2:
307 359 switch (pfl->cmd) {
308 360 case 0xe8: /* Block write */
309   - p = pfl->storage;
310   - DPRINTF("%s: block write offset " TARGET_FMT_lx
311   - " value %x counter " TARGET_FMT_lx "\n",
312   - __func__, offset, value, pfl->counter);
313   - switch (width) {
314   - case 1:
315   - p[offset] = value;
316   - pflash_update(pfl, offset, 1);
317   - break;
318   - case 2:
319   -#if defined(TARGET_WORDS_BIGENDIAN)
320   - p[offset] = value >> 8;
321   - p[offset + 1] = value;
322   -#else
323   - p[offset] = value;
324   - p[offset + 1] = value >> 8;
325   -#endif
326   - pflash_update(pfl, offset, 2);
327   - break;
328   - case 4:
329   -#if defined(TARGET_WORDS_BIGENDIAN)
330   - p[offset] = value >> 24;
331   - p[offset + 1] = value >> 16;
332   - p[offset + 2] = value >> 8;
333   - p[offset + 3] = value;
334   -#else
335   - p[offset] = value;
336   - p[offset + 1] = value >> 8;
337   - p[offset + 2] = value >> 16;
338   - p[offset + 3] = value >> 24;
339   -#endif
340   - pflash_update(pfl, offset, 4);
341   - break;
342   - }
  361 + pflash_data_write(pfl, offset, value, width);
343 362  
344 363 pfl->status |= 0x80;
345 364  
... ...