/[gxemul]/trunk/src/devices/dev_8253.c
This is repository of my old source code which isn't updated any more. Go to git.rot13.org for current projects!
ViewVC logotype

Diff of /trunk/src/devices/dev_8253.c

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 6 by dpavlin, Mon Oct 8 16:18:11 2007 UTC revision 22 by dpavlin, Mon Oct 8 16:19:37 2007 UTC
# Line 1  Line 1 
1  /*  /*
2   *  Copyright (C) 2005  Anders Gavare.  All rights reserved.   *  Copyright (C) 2005-2006  Anders Gavare.  All rights reserved.
3   *   *
4   *  Redistribution and use in source and binary forms, with or without   *  Redistribution and use in source and binary forms, with or without
5   *  modification, are permitted provided that the following conditions are met:   *  modification, are permitted provided that the following conditions are met:
# Line 25  Line 25 
25   *  SUCH DAMAGE.   *  SUCH DAMAGE.
26   *     *  
27   *   *
28   *  $Id: dev_8253.c,v 1.4 2005/05/21 07:41:11 debug Exp $   *  $Id: dev_8253.c,v 1.9 2006/02/09 20:02:58 debug Exp $
29   *     *  
30   *  8253/8254 Programmable Interval Timer.   *  8253/8254 Programmable Interval Timer.
31   *   *
# Line 51  Line 51 
51    
52  struct pit8253_data {  struct pit8253_data {
53          int             irq_nr;          int             irq_nr;
54            int             in_use;
55          int             counter_select;          int             counter_select;
56  };  };
57    
# Line 61  struct pit8253_data { Line 62  struct pit8253_data {
62  void dev_8253_tick(struct cpu *cpu, void *extra)  void dev_8253_tick(struct cpu *cpu, void *extra)
63  {  {
64          struct pit8253_data *d = (struct pit8253_data *) extra;          struct pit8253_data *d = (struct pit8253_data *) extra;
65    
66            if (!d->in_use)
67                    return;
68    
69          cpu_interrupt(cpu, d->irq_nr);          cpu_interrupt(cpu, d->irq_nr);
70  }  }
71    
# Line 68  void dev_8253_tick(struct cpu *cpu, void Line 73  void dev_8253_tick(struct cpu *cpu, void
73  /*  /*
74   *  dev_8253_access():   *  dev_8253_access():
75   */   */
76  int dev_8253_access(struct cpu *cpu, struct memory *mem,  DEVICE_ACCESS(8253)
         uint64_t relative_addr, unsigned char *data, size_t len,  
         int writeflag, void *extra)  
77  {  {
78          struct pit8253_data *d = (struct pit8253_data *) extra;          struct pit8253_data *d = (struct pit8253_data *) extra;
79          uint64_t idata = 0, odata = 0;          uint64_t idata = 0, odata = 0;
80    
81          idata = memory_readmax64(cpu, data, len);          if (writeflag == MEM_WRITE)
82                    idata = memory_readmax64(cpu, data, len);
83    
84            d->in_use = 1;
85    
86          /*  TODO: ack somewhere else  */          /*  TODO: ack somewhere else  */
87          cpu_interrupt_ack(cpu, d->irq_nr);          cpu_interrupt_ack(cpu, d->irq_nr);
# Line 86  int dev_8253_access(struct cpu *cpu, str Line 92  int dev_8253_access(struct cpu *cpu, str
92                          /*  TODO  */                          /*  TODO  */
93                  } else {                  } else {
94                          /*  TODO  */                          /*  TODO  */
95                          odata = 1;                          /*  odata = 1;  */
96  odata = random();                          odata = random();
97                  }                  }
98                  break;                  break;
99          case 0x03:          case 0x03:
# Line 115  odata = random(); Line 121  odata = random();
121  }  }
122    
123    
124  /*  DEVINIT(8253)
  *  devinit_8253():  
  */  
 int devinit_8253(struct devinit *devinit)  
125  {  {
126          struct pit8253_data *d = malloc(sizeof(struct pit8253_data));          struct pit8253_data *d = malloc(sizeof(struct pit8253_data));
127    
# Line 128  int devinit_8253(struct devinit *devinit Line 131  int devinit_8253(struct devinit *devinit
131          }          }
132          memset(d, 0, sizeof(struct pit8253_data));          memset(d, 0, sizeof(struct pit8253_data));
133          d->irq_nr = devinit->irq_nr;          d->irq_nr = devinit->irq_nr;
134            d->in_use = devinit->in_use;
135    
136          memory_device_register(devinit->machine->memory, devinit->name,          memory_device_register(devinit->machine->memory, devinit->name,
137              devinit->addr, DEV_8253_LENGTH, dev_8253_access, (void *)d,              devinit->addr, DEV_8253_LENGTH, dev_8253_access, (void *)d,
138              MEM_DEFAULT, NULL);              DM_DEFAULT, NULL);
139    
140          machine_add_tickfunction(devinit->machine, dev_8253_tick,          machine_add_tickfunction(devinit->machine, dev_8253_tick,
141              d, TICK_SHIFT);              d, TICK_SHIFT);

Legend:
Removed from v.6  
changed lines
  Added in v.22

  ViewVC Help
Powered by ViewVC 1.1.26