DS1225Y nvram device, by Herve Poussineau.
git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@2460 c046a42c-6fe2-441c-8c8c-71466251a162
This commit is contained in:
		
							parent
							
								
									c5be9f0898
								
							
						
					
					
						commit
						9542611a66
					
				@ -383,7 +383,7 @@ CPPFLAGS += -DHAS_AUDIO
 | 
				
			|||||||
endif
 | 
					endif
 | 
				
			||||||
ifeq ($(TARGET_ARCH), mips)
 | 
					ifeq ($(TARGET_ARCH), mips)
 | 
				
			||||||
VL_OBJS+= mips_r4k.o mips_malta.o mips_timer.o mips_int.o dma.o vga.o serial.o i8254.o i8259.o
 | 
					VL_OBJS+= mips_r4k.o mips_malta.o mips_timer.o mips_int.o dma.o vga.o serial.o i8254.o i8259.o
 | 
				
			||||||
VL_OBJS+= ide.o gt64xxx.o pckbd.o ps2.o fdc.o mc146818rtc.o usb-uhci.o acpi.o
 | 
					VL_OBJS+= ide.o gt64xxx.o pckbd.o ps2.o fdc.o mc146818rtc.o usb-uhci.o acpi.o ds1225y.o
 | 
				
			||||||
VL_OBJS+= piix_pci.o parallel.o mixeng.o cirrus_vga.o $(SOUND_HW) $(AUDIODRV)
 | 
					VL_OBJS+= piix_pci.o parallel.o mixeng.o cirrus_vga.o $(SOUND_HW) $(AUDIODRV)
 | 
				
			||||||
DEFINES += -DHAS_AUDIO
 | 
					DEFINES += -DHAS_AUDIO
 | 
				
			||||||
endif
 | 
					endif
 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										121
									
								
								hw/ds1225y.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										121
									
								
								hw/ds1225y.c
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,121 @@
 | 
				
			|||||||
 | 
					/*
 | 
				
			||||||
 | 
					 * QEMU NVRAM emulation for DS1225Y chip
 | 
				
			||||||
 | 
					 * 
 | 
				
			||||||
 | 
					 * Copyright (c) 2007 Hervé Poussineau
 | 
				
			||||||
 | 
					 * 
 | 
				
			||||||
 | 
					 * Permission is hereby granted, free of charge, to any person obtaining a copy
 | 
				
			||||||
 | 
					 * of this software and associated documentation files (the "Software"), to deal
 | 
				
			||||||
 | 
					 * in the Software without restriction, including without limitation the rights
 | 
				
			||||||
 | 
					 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
 | 
				
			||||||
 | 
					 * copies of the Software, and to permit persons to whom the Software is
 | 
				
			||||||
 | 
					 * furnished to do so, subject to the following conditions:
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * The above copyright notice and this permission notice shall be included in
 | 
				
			||||||
 | 
					 * all copies or substantial portions of the Software.
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 | 
				
			||||||
 | 
					 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 | 
				
			||||||
 | 
					 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
 | 
				
			||||||
 | 
					 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 | 
				
			||||||
 | 
					 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
 | 
				
			||||||
 | 
					 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
 | 
				
			||||||
 | 
					 * THE SOFTWARE.
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include "vl.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					typedef enum
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    none = 0,
 | 
				
			||||||
 | 
					    readmode,
 | 
				
			||||||
 | 
					    writemode,
 | 
				
			||||||
 | 
					} nvram_open_mode;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					struct ds1225y_t
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    target_ulong mem_base;
 | 
				
			||||||
 | 
					    uint32_t capacity;
 | 
				
			||||||
 | 
					    const char *filename;
 | 
				
			||||||
 | 
					    QEMUFile *file;
 | 
				
			||||||
 | 
					    nvram_open_mode open_mode;
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static int ds1225y_set_to_mode(ds1225y_t *NVRAM, nvram_open_mode mode, const char *filemode)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    if (NVRAM->open_mode != mode)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        if (NVRAM->file)
 | 
				
			||||||
 | 
					            qemu_fclose(NVRAM->file);
 | 
				
			||||||
 | 
					        NVRAM->file = qemu_fopen(NVRAM->filename, filemode);
 | 
				
			||||||
 | 
					        NVRAM->open_mode = mode;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    return (NVRAM->file != NULL);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static uint32_t nvram_readb (void *opaque, target_phys_addr_t addr)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    ds1225y_t *NVRAM = opaque;
 | 
				
			||||||
 | 
					    int64_t pos;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    pos = addr - NVRAM->mem_base;
 | 
				
			||||||
 | 
					    if (addr >= NVRAM->capacity)
 | 
				
			||||||
 | 
					        addr -= NVRAM->capacity;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if (!ds1225y_set_to_mode(NVRAM, readmode, "rb"))
 | 
				
			||||||
 | 
					        return 0;
 | 
				
			||||||
 | 
					    qemu_fseek(NVRAM->file, pos, SEEK_SET);
 | 
				
			||||||
 | 
					    return (uint32_t)qemu_get_byte(NVRAM->file);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static void nvram_writeb (void *opaque, target_phys_addr_t addr, uint32_t value)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    ds1225y_t *NVRAM = opaque;
 | 
				
			||||||
 | 
					    int64_t pos;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    pos = addr - NVRAM->mem_base;
 | 
				
			||||||
 | 
					    if (ds1225y_set_to_mode(NVRAM, writemode, "wb"))
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        qemu_fseek(NVRAM->file, pos, SEEK_SET);
 | 
				
			||||||
 | 
					        qemu_put_byte(NVRAM->file, (int)value);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static CPUReadMemoryFunc *nvram_read[] = {
 | 
				
			||||||
 | 
					    &nvram_readb,
 | 
				
			||||||
 | 
					    NULL,
 | 
				
			||||||
 | 
					    NULL,
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static CPUWriteMemoryFunc *nvram_write[] = {
 | 
				
			||||||
 | 
					    &nvram_writeb,
 | 
				
			||||||
 | 
					    NULL,
 | 
				
			||||||
 | 
					    NULL,
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static CPUWriteMemoryFunc *nvram_none[] = {
 | 
				
			||||||
 | 
					    NULL,
 | 
				
			||||||
 | 
					    NULL,
 | 
				
			||||||
 | 
					    NULL,
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* Initialisation routine */
 | 
				
			||||||
 | 
					ds1225y_t *ds1225y_init(target_ulong mem_base, const char *filename)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    ds1225y_t *s;
 | 
				
			||||||
 | 
					    int mem_index1, mem_index2;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    s = qemu_mallocz(sizeof(ds1225y_t));
 | 
				
			||||||
 | 
					    if (!s)
 | 
				
			||||||
 | 
					        return NULL;
 | 
				
			||||||
 | 
					    s->mem_base = mem_base;
 | 
				
			||||||
 | 
					    s->capacity = 0x2000; /* Fixed for ds1225y chip: 8K */
 | 
				
			||||||
 | 
					    s->filename = filename;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /* Read/write memory */
 | 
				
			||||||
 | 
					    mem_index1 = cpu_register_io_memory(0, nvram_read, nvram_write, s);
 | 
				
			||||||
 | 
					    cpu_register_physical_memory(mem_base, s->capacity, mem_index1);
 | 
				
			||||||
 | 
					    /* Read-only memory */
 | 
				
			||||||
 | 
					    mem_index2 = cpu_register_io_memory(0, nvram_read, nvram_none, s);
 | 
				
			||||||
 | 
					    cpu_register_physical_memory(mem_base + s->capacity, s->capacity, mem_index2);
 | 
				
			||||||
 | 
					    return s;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
@ -215,6 +215,7 @@ void mips_r4k_init (int ram_size, int vga_ram_size, int boot_device,
 | 
				
			|||||||
                     bs_table[2 * i], bs_table[2 * i + 1]);
 | 
					                     bs_table[2 * i], bs_table[2 * i + 1]);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    kbd_init();
 | 
					    kbd_init();
 | 
				
			||||||
 | 
					    ds1225y_init(0x9000, "nvram");
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
QEMUMachine mips_machine = {
 | 
					QEMUMachine mips_machine = {
 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										4
									
								
								vl.h
									
									
									
									
									
								
							
							
						
						
									
										4
									
								
								vl.h
									
									
									
									
									
								
							@ -941,6 +941,10 @@ int pmac_ide_init (BlockDriverState **hd_table,
 | 
				
			|||||||
int cdrom_read_toc(int nb_sectors, uint8_t *buf, int msf, int start_track);
 | 
					int cdrom_read_toc(int nb_sectors, uint8_t *buf, int msf, int start_track);
 | 
				
			||||||
int cdrom_read_toc_raw(int nb_sectors, uint8_t *buf, int msf, int session_num);
 | 
					int cdrom_read_toc_raw(int nb_sectors, uint8_t *buf, int msf, int session_num);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* ds1225y.c */
 | 
				
			||||||
 | 
					typedef struct ds1225y_t ds1225y_t;
 | 
				
			||||||
 | 
					ds1225y_t *ds1225y_init(target_ulong mem_base, const char *filename);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* es1370.c */
 | 
					/* es1370.c */
 | 
				
			||||||
int es1370_init (PCIBus *bus, AudioState *s);
 | 
					int es1370_init (PCIBus *bus, AudioState *s);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user