- int i;
- int ADDATA_val = 0xFFFF;
- mf624_state_t *s = opaque;
-
- switch (addr % BAR2_size) {
- /* Reading from ADDATA FIFO register */
- case ADDATA_off:
- case ADDATA1_off: // Mirrored registers
- case ADDATA2_off:
- case ADDATA3_off:
- case ADDATA4_off:
- case ADDATA5_off:
- case ADDATA6_off:
- case ADDATA7_off:
- if (!(s->BAR0.GPIOC & GPIOC_EOLC_mask)) { //Has the conversion already ended?
- #define ADC_CHANNELS 8
- for(i = s->ADDATA_FIFO_POSITION; i < ADC_CHANNELS; i ++) {
- if (s->BAR2.ADCTRL & (1 << i)) {
- s->ADDATA_FIFO_POSITION = i; // Move to next AD to be read
- }
- }
-
- switch (s->ADDATA_FIFO_POSITION)
- {
- case 0:
- ADDATA_val = s->BAR2.ADDATA;
- break;
- case 1:
- ADDATA_val = s->BAR2.ADDATA1;
- break;
- case 2:
- ADDATA_val = s->BAR2.ADDATA2;
- break;
- case 3:
- ADDATA_val = s->BAR2.ADDATA3;
- break;
- case 4:
- ADDATA_val = s->BAR2.ADDATA4;
- break;
- case 5:
- ADDATA_val = s->BAR2.ADDATA5;
- break;
- case 6:
- ADDATA_val = s->BAR2.ADDATA6;
- break;
- case 7:
- ADDATA_val = s->BAR2.ADDATA7;
- break;
- default: // restart counter
- s->ADDATA_FIFO_POSITION = 0;
- ADDATA_val = s->BAR2.ADDATA;
- break;
- }
- s->ADDATA_FIFO_POSITION ++;
- return ADDATA_val;
- }
- return 0xFFFF; // Semirandom value
-
- /* Digital Input*/
- case DIN_off:
- return s->BAR2.DIN;
-
- /* A/D Conversion Start. Reading this register triggers A/D
- conversion for all channels selected in ADCTRL. */
- case ADSTART_off:
- s->BAR0.GPIOC |= GPIOC_EOLC_mask; // Conversion in progress
- s->ADDATA_FIFO_POSITION = 0;
- for (i = 0; i < 5000; i++)
- ; // Small delay simulating real conversion
-
- // Check before assignement, if particular ADC is enabled
- s->BAR2.ADDATA = (s->BAR2.ADCTRL & (1 << 0)) ? s->real_world_AD0 : s->BAR2.ADDATA;
- s->BAR2.ADDATA1 = (s->BAR2.ADCTRL & (1 << 1)) ? s->real_world_AD1 : s->BAR2.ADDATA1;
- s->BAR2.ADDATA2 = (s->BAR2.ADCTRL & (1 << 2)) ? s->real_world_AD2 : s->BAR2.ADDATA2;
- s->BAR2.ADDATA3 = (s->BAR2.ADCTRL & (1 << 3)) ? s->real_world_AD3 : s->BAR2.ADDATA3;
- s->BAR2.ADDATA4 = (s->BAR2.ADCTRL & (1 << 4)) ? s->real_world_AD4 : s->BAR2.ADDATA4;
- s->BAR2.ADDATA5 = (s->BAR2.ADCTRL & (1 << 5)) ? s->real_world_AD5 : s->BAR2.ADDATA5;
- s->BAR2.ADDATA6 = (s->BAR2.ADCTRL & (1 << 6)) ? s->real_world_AD6 : s->BAR2.ADDATA6;
- s->BAR2.ADDATA7 = (s->BAR2.ADCTRL & (1 << 7)) ? s->real_world_AD7 : s->BAR2.ADDATA7;
-
- //All channels converted
- s->BAR0.GPIOC &= ~ GPIOC_EOLC_mask;
-
- return 0xFFFF; // Semirandom value
-
- default:
- printf("mf624_BAR2_read16(): addr = "
- TARGET_FMT_plx "\n", addr);
- return 0x0;
- }
+ int i;
+ int ADDATA_val = 0xFFFF;
+ mf624_state_t *s = opaque;
+
+ switch (addr % BAR2_size) {
+ /* Reading from ADDATA FIFO register */
+ case ADDATA_off:
+ case ADDATA1_off: /* Mirrored registers */
+ case ADDATA2_off:
+ case ADDATA3_off:
+ case ADDATA4_off:
+ case ADDATA5_off:
+ case ADDATA6_off:
+ case ADDATA7_off:
+ if (!(s->BAR0.GPIOC & GPIOC_EOLC_mask)) { /* Has the conversion already ended? */
+ #define ADC_CHANNELS 8
+ for (i = s->ADDATA_FIFO_POSITION; i < ADC_CHANNELS; i++) {
+ if (s->BAR2.ADCTRL & (1 << i)) {
+ s->ADDATA_FIFO_POSITION = i; /* Move to next AD to be read */
+ }
+ }
+
+ switch (s->ADDATA_FIFO_POSITION) {
+ case 0:
+ ADDATA_val = s->BAR2.ADDATA;
+ break;
+ case 1:
+ ADDATA_val = s->BAR2.ADDATA1;
+ break;
+ case 2:
+ ADDATA_val = s->BAR2.ADDATA2;
+ break;
+ case 3:
+ ADDATA_val = s->BAR2.ADDATA3;
+ break;
+ case 4:
+ ADDATA_val = s->BAR2.ADDATA4;
+ break;
+ case 5:
+ ADDATA_val = s->BAR2.ADDATA5;
+ break;
+ case 6:
+ ADDATA_val = s->BAR2.ADDATA6;
+ break;
+ case 7:
+ ADDATA_val = s->BAR2.ADDATA7;
+ break;
+ default: /* restart counter */
+ s->ADDATA_FIFO_POSITION = 0;
+ ADDATA_val = s->BAR2.ADDATA;
+ break;
+ }
+ s->ADDATA_FIFO_POSITION++;
+ return ADDATA_val;
+ }
+ return 0xFFFF; /* Semirandom value */
+
+ /* Digital Input*/
+ case DIN_off:
+ return s->BAR2.DIN;
+
+ /* A/D Conversion Start. Reading this register triggers A/D
+ conversion for all channels selected in ADCTRL. */
+ case ADSTART_off:
+ s->BAR0.GPIOC |= GPIOC_EOLC_mask; /* Conversion in progress */
+ s->ADDATA_FIFO_POSITION = 0;
+
+ /* Simulation of the time delay of real conversion should be implemented there */
+
+ /* Check before assignement, if particular ADC is enabled */
+ s->BAR2.ADDATA = (s->BAR2.ADCTRL & (1 << 0)) ?
+ s->real_world_AD0 : s->BAR2.ADDATA;
+ s->BAR2.ADDATA1 = (s->BAR2.ADCTRL & (1 << 1)) ?
+ s->real_world_AD1 : s->BAR2.ADDATA1;
+ s->BAR2.ADDATA2 = (s->BAR2.ADCTRL & (1 << 2)) ?
+ s->real_world_AD2 : s->BAR2.ADDATA2;
+ s->BAR2.ADDATA3 = (s->BAR2.ADCTRL & (1 << 3)) ?
+ s->real_world_AD3 : s->BAR2.ADDATA3;
+ s->BAR2.ADDATA4 = (s->BAR2.ADCTRL & (1 << 4)) ?
+ s->real_world_AD4 : s->BAR2.ADDATA4;
+ s->BAR2.ADDATA5 = (s->BAR2.ADCTRL & (1 << 5)) ?
+ s->real_world_AD5 : s->BAR2.ADDATA5;
+ s->BAR2.ADDATA6 = (s->BAR2.ADCTRL & (1 << 6)) ?
+ s->real_world_AD6 : s->BAR2.ADDATA6;
+ s->BAR2.ADDATA7 = (s->BAR2.ADCTRL & (1 << 7)) ?
+ s->real_world_AD7 : s->BAR2.ADDATA7;
+
+ /* All channels converted */
+ s->BAR0.GPIOC &= ~GPIOC_EOLC_mask;
+
+ return 0xFFFF; /* Semirandom value */
+
+ default:
+ printf("mf624_BAR2_read16(): addr = "
+ TARGET_FMT_plx "\n", addr);
+ return 0x0;
+ }