* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
- * MA 02111-1307 USA
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, see <http://www.gnu.org/licenses/>.
*/
#include "hw.h"
#include "qemu-timer.h"
#include "console.h"
+#include "devices.h"
#define TSC_CUT_RESOLUTION(value, p) ((value) >> (16 - (p ? 12 : 10)))
-struct tsc2005_state_s {
+typedef struct {
qemu_irq pint; /* Combination of the nPENIRQ and DAV signals */
QEMUTimer *timer;
uint16_t model;
uint16_t aux_thr[2];
int tr[8];
-};
+} TSC2005State;
enum {
TSC_MODE_XYZ_SCAN = 0x0,
#define TEMP1_VAL (1264 << 4) /* +/- 5 at 12-bit */
#define TEMP2_VAL (1531 << 4) /* +/- 5 at 12-bit */
-static uint16_t tsc2005_read(struct tsc2005_state_s *s, int reg)
+static uint16_t tsc2005_read(TSC2005State *s, int reg)
{
uint16_t ret;
return 0xffff;
}
-static void tsc2005_write(struct tsc2005_state_s *s, int reg, uint16_t data)
+static void tsc2005_write(TSC2005State *s, int reg, uint16_t data)
{
switch (reg) {
case 0x8: /* AUX high treshold */
}
/* This handles most of the chip's logic. */
-static void tsc2005_pin_update(struct tsc2005_state_s *s)
+static void tsc2005_pin_update(TSC2005State *s)
{
int64_t expires;
int pin_state;
s->precision = s->nextprecision;
s->function = s->nextfunction;
s->pdst = !s->pnd0; /* Synchronised on internal clock */
- expires = qemu_get_clock(vm_clock) + (ticks_per_sec >> 7);
+ expires = qemu_get_clock_ns(vm_clock) + (get_ticks_per_sec() >> 7);
qemu_mod_timer(s->timer, expires);
}
-static void tsc2005_reset(struct tsc2005_state_s *s)
+static void tsc2005_reset(TSC2005State *s)
{
s->state = 0;
s->pin_func = 0;
tsc2005_pin_update(s);
}
-uint8_t tsc2005_txrx_word(void *opaque, uint8_t value)
+static uint8_t tsc2005_txrx_word(void *opaque, uint8_t value)
{
- struct tsc2005_state_s *s = opaque;
+ TSC2005State *s = opaque;
uint32_t ret = 0;
switch (s->state ++) {
static void tsc2005_timer_tick(void *opaque)
{
- struct tsc2005_state_s *s = opaque;
+ TSC2005State *s = opaque;
/* Timer ticked -- a set of conversions has been finished. */
static void tsc2005_touchscreen_event(void *opaque,
int x, int y, int z, int buttons_state)
{
- struct tsc2005_state_s *s = opaque;
+ TSC2005State *s = opaque;
int p = s->pressure;
if (buttons_state) {
static void tsc2005_save(QEMUFile *f, void *opaque)
{
- struct tsc2005_state_s *s = (struct tsc2005_state_s *) opaque;
+ TSC2005State *s = (TSC2005State *) opaque;
int i;
qemu_put_be16(f, s->x);
static int tsc2005_load(QEMUFile *f, void *opaque, int version_id)
{
- struct tsc2005_state_s *s = (struct tsc2005_state_s *) opaque;
+ TSC2005State *s = (TSC2005State *) opaque;
int i;
s->x = qemu_get_be16(f);
return 0;
}
-static int tsc2005_iid = 0;
-
void *tsc2005_init(qemu_irq pintdav)
{
- struct tsc2005_state_s *s;
+ TSC2005State *s;
- s = (struct tsc2005_state_s *)
- qemu_mallocz(sizeof(struct tsc2005_state_s));
+ s = (TSC2005State *)
+ qemu_mallocz(sizeof(TSC2005State));
s->x = 400;
s->y = 240;
s->pressure = 0;
s->precision = s->nextprecision = 0;
- s->timer = qemu_new_timer(vm_clock, tsc2005_timer_tick, s);
+ s->timer = qemu_new_timer_ns(vm_clock, tsc2005_timer_tick, s);
s->pint = pintdav;
s->model = 0x2005;
"QEMU TSC2005-driven Touchscreen");
qemu_register_reset((void *) tsc2005_reset, s);
- register_savevm("tsc2005", tsc2005_iid ++, 0,
- tsc2005_save, tsc2005_load, s);
+ register_savevm(NULL, "tsc2005", -1, 0, tsc2005_save, tsc2005_load, s);
return s;
}
* from the touchscreen. Assuming 12-bit precision was used during
* tslib calibration.
*/
-void tsc2005_set_transform(void *opaque, struct mouse_transform_info_s *info)
+void tsc2005_set_transform(void *opaque, MouseTransformInfo *info)
{
- struct tsc2005_state_s *s = (struct tsc2005_state_s *) opaque;
+ TSC2005State *s = (TSC2005State *) opaque;
/* This version assumes touchscreen X & Y axis are parallel or
* perpendicular to LCD's X & Y axis in some way. */