summaryrefslogblamecommitdiffstatshomepage
path: root/src/devices/machine/pxa255.h
blob: e0ef592271d57dba671bb72b185e68c6745e98fc (plain) (tree)
1
2
3
4
5
6
7
8
9
10
11










                                                                            

                           


            






                              












                                                                                                                           


                                                                   

























































































































































































                                                                                                       
                             
// license:BSD-3-Clause
// copyright-holders:Ryan Holtz
/**************************************************************************
 *
 * Intel XScale PXA255 peripheral emulation
 *
 * TODO:
 *   Most things
 *
 **************************************************************************/

#ifndef MAME_MACHINE_PXA255
#define MAME_MACHINE_PXA255

#pragma once

#include "cpu/arm7/arm7.h"
#include "cpu/arm7/arm7core.h"
#include "sound/dmadac.h"
#include "emupal.h"

#include "pxa255defs.h"


class pxa255_periphs_device : public device_t
{
public:
	template <typename T>
	pxa255_periphs_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock, T &&cpu_tag)
		: pxa255_periphs_device(mconfig, tag, owner, clock)
	{
		m_maincpu.set_tag(std::forward<T>(cpu_tag));
	}

	pxa255_periphs_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);

	auto gpio0_set_cb() { return m_gpio0_set_func.bind(); }
	auto gpio0_clear_cb() { return m_gpio0_clear_func.bind(); }
	auto gpio0_in_cb() { return m_gpio0_in_func.bind(); }

	DECLARE_READ32_MEMBER(pxa255_i2s_r);
	DECLARE_WRITE32_MEMBER(pxa255_i2s_w);
	DECLARE_READ32_MEMBER(pxa255_dma_r);
	DECLARE_WRITE32_MEMBER(pxa255_dma_w);
	DECLARE_READ32_MEMBER(pxa255_ostimer_r);
	DECLARE_WRITE32_MEMBER(pxa255_ostimer_w);
	DECLARE_READ32_MEMBER(pxa255_intc_r);
	DECLARE_WRITE32_MEMBER(pxa255_intc_w);
	DECLARE_READ32_MEMBER(pxa255_gpio_r);
	DECLARE_WRITE32_MEMBER(pxa255_gpio_w);
	DECLARE_READ32_MEMBER(pxa255_lcd_r);
	DECLARE_WRITE32_MEMBER(pxa255_lcd_w);

protected:
	virtual void device_add_mconfig(machine_config &config) override;
	virtual void device_start() override;
	virtual void device_reset() override;

	void pxa255_dma_irq_check();
	void pxa255_dma_load_descriptor_and_start(int channel);
	void pxa255_ostimer_irq_check();
	void pxa255_update_interrupts();
	void pxa255_set_irq_line(uint32_t line, int state);
	void pxa255_lcd_load_dma_descriptor(address_space & space, uint32_t address, int channel);
	void pxa255_lcd_irq_check();
	void pxa255_lcd_dma_kickoff(int channel);
	void pxa255_lcd_check_load_next_branch(int channel);

	uint32_t screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect);

	TIMER_CALLBACK_MEMBER(pxa255_dma_dma_end);
	TIMER_CALLBACK_MEMBER(pxa255_ostimer_match);
	TIMER_CALLBACK_MEMBER(pxa255_lcd_dma_eof);

	struct dma_regs_t
	{
		uint32_t dcsr[16];
		uint32_t pad0[44];

		uint32_t dint;
		uint32_t pad1[3];

		uint32_t drcmr[40];
		uint32_t pad2[24];

		uint32_t ddadr[16];
		uint32_t dsadr[16];
		uint32_t dtadr[16];
		uint32_t dcmd[16];

		emu_timer* timer[16];
	};

	struct i2s_regs_t
	{
		uint32_t sacr0;
		uint32_t sacr1;
		uint32_t pad0;

		uint32_t sasr0;
		uint32_t pad1;

		uint32_t saimr;
		uint32_t saicr;
		uint32_t pad2[17];

		uint32_t sadiv;
		uint32_t pad3[6];

		uint32_t sadr;
	};

	struct ostmr_regs_t
	{
		uint32_t osmr[4];
		uint32_t oscr;
		uint32_t ossr;
		uint32_t ower;
		uint32_t oier;

		emu_timer* timer[4];
	};

	struct intc_regs_t
	{
		uint32_t icip;
		uint32_t icmr;
		uint32_t iclr;
		uint32_t icfp;
		uint32_t icpr;
		uint32_t iccr;
	};

	struct gpio_regs_t
	{
		uint32_t gplr0; // GPIO Pin-Level
		uint32_t gplr1;
		uint32_t gplr2;

		uint32_t gpdr0;
		uint32_t gpdr1;
		uint32_t gpdr2;

		uint32_t gpsr0;
		uint32_t gpsr1;
		uint32_t gpsr2;

		uint32_t gpcr0;
		uint32_t gpcr1;
		uint32_t gpcr2;

		uint32_t grer0;
		uint32_t grer1;
		uint32_t grer2;

		uint32_t gfer0;
		uint32_t gfer1;
		uint32_t gfer2;

		uint32_t gedr0;
		uint32_t gedr1;
		uint32_t gedr2;

		uint32_t gafr0l;
		uint32_t gafr0u;
		uint32_t gafr1l;
		uint32_t gafr1u;
		uint32_t gafr2l;
		uint32_t gafr2u;
	};

	struct lcd_dma_regs_t
	{
		uint32_t fdadr;
		uint32_t fsadr;
		uint32_t fidr;
		uint32_t ldcmd;
		emu_timer *eof;
	};

	struct lcd_regs_t
	{
		uint32_t lccr0;
		uint32_t lccr1;
		uint32_t lccr2;
		uint32_t lccr3;
		uint32_t pad0[4];

		uint32_t fbr[2];
		uint32_t pad1[4];

		uint32_t lcsr;
		uint32_t liidr;
		uint32_t trgbr;
		uint32_t tcr;
		uint32_t pad2[110];

		lcd_dma_regs_t dma[2];
	};

	dma_regs_t m_dma_regs;
	i2s_regs_t m_i2s_regs;
	ostmr_regs_t m_ostimer_regs;
	intc_regs_t m_intc_regs;
	gpio_regs_t m_gpio_regs;
	lcd_regs_t m_lcd_regs;

	devcb_write32 m_gpio0_set_func;
	devcb_write32 m_gpio0_clear_func;
	devcb_read32 m_gpio0_in_func;

	required_device<cpu_device> m_maincpu;
	required_device_array<dmadac_sound_device, 2> m_dmadac;
	required_device<palette_device> m_palette;

	std::unique_ptr<uint32_t[]> m_pxa255_lcd_palette; // 0x100
	std::unique_ptr<uint8_t[]> m_pxa255_lcd_framebuffer; // 0x100000
	std::unique_ptr<uint32_t[]> m_words; // 0x800
	std::unique_ptr<int16_t[]> m_samples; // 0x1000

	inline void ATTR_PRINTF(3,4) verboselog(int n_level, const char *s_fmt, ... );
};

DECLARE_DEVICE_TYPE(PXA255_PERIPHERALS, pxa255_periphs_device)

#endif // MAME_MACHINE_PXA255