2 * LatticeMico32 JTAG UART model.
4 * Copyright (c) 2010 Michael Walle <michael@walle.cc>
6 * This library is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU Lesser General Public
8 * License as published by the Free Software Foundation; either
9 * version 2 of the License, or (at your option) any later version.
11 * This library is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * Lesser General Public License for more details.
16 * You should have received a copy of the GNU Lesser General Public
17 * License along with this library; if not, see <http://www.gnu.org/licenses/>.
23 #include "qemu-char.h"
25 #include "lm32_juart.h"
28 LM32_JUART_MIN_SAVE_VERSION
= 0,
29 LM32_JUART_CURRENT_SAVE_VERSION
= 0,
30 LM32_JUART_MAX_SAVE_VERSION
= 0,
41 struct LM32JuartState
{
48 typedef struct LM32JuartState LM32JuartState
;
50 static void juart_update_handlers(LM32JuartState
*s
);
52 uint32_t lm32_juart_get_jtx(DeviceState
*d
)
54 LM32JuartState
*s
= container_of(d
, LM32JuartState
, busdev
.qdev
);
56 trace_lm32_juart_get_jtx(s
->jtx
);
60 uint32_t lm32_juart_get_jrx(DeviceState
*d
)
62 LM32JuartState
*s
= container_of(d
, LM32JuartState
, busdev
.qdev
);
64 trace_lm32_juart_get_jrx(s
->jrx
);
68 void lm32_juart_set_jtx(DeviceState
*d
, uint32_t jtx
)
70 LM32JuartState
*s
= container_of(d
, LM32JuartState
, busdev
.qdev
);
71 unsigned char ch
= jtx
& 0xff;
73 trace_lm32_juart_set_jtx(s
->jtx
);
77 qemu_chr_fe_write(s
->chr
, &ch
, 1);
81 void lm32_juart_set_jrx(DeviceState
*d
, uint32_t jtx
)
83 LM32JuartState
*s
= container_of(d
, LM32JuartState
, busdev
.qdev
);
85 trace_lm32_juart_set_jrx(s
->jrx
);
87 juart_update_handlers(s
);
90 static void juart_rx(LM32JuartState
*s
, const uint8_t *buf
, int size
)
92 s
->jrx
= *buf
| JRX_FULL
;
93 juart_update_handlers(s
);
96 static int juart_can_rx(LM32JuartState
*s
)
98 return !(s
->jrx
& JRX_FULL
);
101 static void juart_event(void *opaque
, int event
)
105 static void juart_rx_handler(void *opaque
)
107 LM32JuartState
*s
= opaque
;
111 size
= juart_can_rx(s
);
112 size
= MIN(size
, sizeof(buf
));
113 size
= qemu_chr_fe_read(s
->chr
, buf
, size
);
115 juart_rx(s
, buf
, size
);
118 static void juart_update_handlers(LM32JuartState
*s
)
120 if (juart_can_rx(s
) > 0) {
121 qemu_chr_fe_set_handlers(s
->chr
, juart_rx_handler
, NULL
, juart_event
, s
);
123 qemu_chr_fe_set_handlers(s
->chr
, NULL
, NULL
, juart_event
, s
);
127 static void juart_reset(DeviceState
*d
)
129 LM32JuartState
*s
= container_of(d
, LM32JuartState
, busdev
.qdev
);
133 juart_update_handlers(s
);
136 static int lm32_juart_init(SysBusDevice
*dev
)
138 LM32JuartState
*s
= FROM_SYSBUS(typeof(*s
), dev
);
140 s
->chr
= qdev_init_chardev(&dev
->qdev
);
142 qemu_chr_fe_open(s
->chr
);
143 juart_update_handlers(s
);
149 static const VMStateDescription vmstate_lm32_juart
= {
150 .name
= "lm32-juart",
152 .minimum_version_id
= 1,
153 .minimum_version_id_old
= 1,
154 .fields
= (VMStateField
[]) {
155 VMSTATE_UINT32(jtx
, LM32JuartState
),
156 VMSTATE_UINT32(jrx
, LM32JuartState
),
157 VMSTATE_END_OF_LIST()
161 static SysBusDeviceInfo lm32_juart_info
= {
162 .init
= lm32_juart_init
,
163 .qdev
.name
= "lm32-juart",
164 .qdev
.size
= sizeof(LM32JuartState
),
165 .qdev
.vmsd
= &vmstate_lm32_juart
,
166 .qdev
.reset
= juart_reset
,
169 static void lm32_juart_register(void)
171 sysbus_register_withprop(&lm32_juart_info
);
174 device_init(lm32_juart_register
)