예제 #1
0
        public SunxiHighSpeedTimer(Machine machine, long frequency)
        {
            irqEnableRegister = new DoubleWordRegister(this);
            irqStatusRegister = new DoubleWordRegister(this);
            
            timers = new SunxiHighSpeedTimerUnit[4];
            interruptFlags = new IFlagRegisterField[4];
            enableFlags = new IFlagRegisterField[4];

            for(var i = 0; i < 4; ++i)
            {
                var j = i;
                timers[i] = new SunxiHighSpeedTimerUnit(machine, frequency);
                timers[i].LimitReached += () => OnTimerLimitReached(j);
                interruptFlags[i] = irqStatusRegister.DefineFlagField(i, FieldMode.WriteOneToClear, name: "Tx_IRQ_PEND");
                enableFlags[i] = irqEnableRegister.DefineFlagField(i, name: "Tx_INT_EN");
            }

            var innerConnections = new Dictionary<int, IGPIO>();
            for(var i = 0; i < 4; ++i)
            {
                innerConnections[i] = new GPIO();
            }
            Connections = new ReadOnlyDictionary<int, IGPIO>(innerConnections);
        }
예제 #2
0
        public SunxiHighSpeedTimer(Machine machine, long frequency)
        {
            irqEnableRegister = new DoubleWordRegister(this);
            irqStatusRegister = new DoubleWordRegister(this);

            timers         = new SunxiHighSpeedTimerUnit[4];
            interruptFlags = new IFlagRegisterField[4];
            enableFlags    = new IFlagRegisterField[4];

            for (var i = 0; i < 4; ++i)
            {
                var j = i;
                timers[i] = new SunxiHighSpeedTimerUnit(machine, frequency);
                timers[i].LimitReached += () => OnTimerLimitReached(j);
                interruptFlags[i]       = irqStatusRegister.DefineFlagField(i, FieldMode.WriteOneToClear, name: "Tx_IRQ_PEND");
                enableFlags[i]          = irqEnableRegister.DefineFlagField(i, name: "Tx_INT_EN");
            }

            var innerConnections = new Dictionary <int, IGPIO>();

            for (var i = 0; i < 4; ++i)
            {
                innerConnections[i] = new GPIO();
            }
            Connections = new ReadOnlyDictionary <int, IGPIO>(innerConnections);
        }
예제 #3
0
        private int GetTimerRegisterByOffset(long offset, out SunxiHighSpeedTimerUnit timer)
        {
            if (offset < 0x10)
            {
                timer = null;
                return((int)offset);
            }

            var offsetPerTimer = ((offset - 0x10) % 0x20) + 0x10;
            var timerNumber    = (uint)(offset - 0x10) / 0x20;

            timer = timers[timerNumber];
            return((int)offsetPerTimer);
        }
예제 #4
0
        private int GetTimerRegisterByOffset(long offset, out SunxiHighSpeedTimerUnit timer)
        {
            if(offset < 0x10)
            {
                timer = null;
                return (int)offset;
            }

            var offsetPerTimer = ((offset - 0x10) % 0x20) + 0x10;
            var timerNumber = (uint)(offset - 0x10) / 0x20;
            timer = timers[timerNumber];
            return (int)offsetPerTimer;
        }