qemu/hw/lm32_juart.c
<<
>>
Prefs
   1/*
   2 *  LatticeMico32 JTAG UART model.
   3 *
   4 *  Copyright (c) 2010 Michael Walle <michael@walle.cc>
   5 *
   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.
  10 *
  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.
  15 *
  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/>.
  18 */
  19
  20#include "hw.h"
  21#include "sysbus.h"
  22#include "trace.h"
  23#include "char/char.h"
  24
  25#include "lm32_juart.h"
  26
  27enum {
  28    LM32_JUART_MIN_SAVE_VERSION = 0,
  29    LM32_JUART_CURRENT_SAVE_VERSION = 0,
  30    LM32_JUART_MAX_SAVE_VERSION = 0,
  31};
  32
  33enum {
  34    JTX_FULL = (1<<8),
  35};
  36
  37enum {
  38    JRX_FULL = (1<<8),
  39};
  40
  41struct LM32JuartState {
  42    SysBusDevice busdev;
  43    CharDriverState *chr;
  44
  45    uint32_t jtx;
  46    uint32_t jrx;
  47};
  48typedef struct LM32JuartState LM32JuartState;
  49
  50uint32_t lm32_juart_get_jtx(DeviceState *d)
  51{
  52    LM32JuartState *s = container_of(d, LM32JuartState, busdev.qdev);
  53
  54    trace_lm32_juart_get_jtx(s->jtx);
  55    return s->jtx;
  56}
  57
  58uint32_t lm32_juart_get_jrx(DeviceState *d)
  59{
  60    LM32JuartState *s = container_of(d, LM32JuartState, busdev.qdev);
  61
  62    trace_lm32_juart_get_jrx(s->jrx);
  63    return s->jrx;
  64}
  65
  66void lm32_juart_set_jtx(DeviceState *d, uint32_t jtx)
  67{
  68    LM32JuartState *s = container_of(d, LM32JuartState, busdev.qdev);
  69    unsigned char ch = jtx & 0xff;
  70
  71    trace_lm32_juart_set_jtx(s->jtx);
  72
  73    s->jtx = jtx;
  74    if (s->chr) {
  75        qemu_chr_fe_write(s->chr, &ch, 1);
  76    }
  77}
  78
  79void lm32_juart_set_jrx(DeviceState *d, uint32_t jtx)
  80{
  81    LM32JuartState *s = container_of(d, LM32JuartState, busdev.qdev);
  82
  83    trace_lm32_juart_set_jrx(s->jrx);
  84    s->jrx &= ~JRX_FULL;
  85}
  86
  87static void juart_rx(void *opaque, const uint8_t *buf, int size)
  88{
  89    LM32JuartState *s = opaque;
  90
  91    s->jrx = *buf | JRX_FULL;
  92}
  93
  94static int juart_can_rx(void *opaque)
  95{
  96    LM32JuartState *s = opaque;
  97
  98    return !(s->jrx & JRX_FULL);
  99}
 100
 101static void juart_event(void *opaque, int event)
 102{
 103}
 104
 105static void juart_reset(DeviceState *d)
 106{
 107    LM32JuartState *s = container_of(d, LM32JuartState, busdev.qdev);
 108
 109    s->jtx = 0;
 110    s->jrx = 0;
 111}
 112
 113static int lm32_juart_init(SysBusDevice *dev)
 114{
 115    LM32JuartState *s = FROM_SYSBUS(typeof(*s), dev);
 116
 117    s->chr = qemu_char_get_next_serial();
 118    if (s->chr) {
 119        qemu_chr_add_handlers(s->chr, juart_can_rx, juart_rx, juart_event, s);
 120    }
 121
 122    return 0;
 123}
 124
 125static const VMStateDescription vmstate_lm32_juart = {
 126    .name = "lm32-juart",
 127    .version_id = 1,
 128    .minimum_version_id = 1,
 129    .minimum_version_id_old = 1,
 130    .fields      = (VMStateField[]) {
 131        VMSTATE_UINT32(jtx, LM32JuartState),
 132        VMSTATE_UINT32(jrx, LM32JuartState),
 133        VMSTATE_END_OF_LIST()
 134    }
 135};
 136
 137static void lm32_juart_class_init(ObjectClass *klass, void *data)
 138{
 139    DeviceClass *dc = DEVICE_CLASS(klass);
 140    SysBusDeviceClass *k = SYS_BUS_DEVICE_CLASS(klass);
 141
 142    k->init = lm32_juart_init;
 143    dc->reset = juart_reset;
 144    dc->vmsd = &vmstate_lm32_juart;
 145}
 146
 147static const TypeInfo lm32_juart_info = {
 148    .name          = "lm32-juart",
 149    .parent        = TYPE_SYS_BUS_DEVICE,
 150    .instance_size = sizeof(LM32JuartState),
 151    .class_init    = lm32_juart_class_init,
 152};
 153
 154static void lm32_juart_register_types(void)
 155{
 156    type_register_static(&lm32_juart_info);
 157}
 158
 159type_init(lm32_juart_register_types)
 160