Ejemplo n.º 1
0
/* Update the Pending Register.  This will trigger an interrupt if a bit is
 * set.
 */
static void stm32_exti_change_EXTI_PR_bit(Stm32Exti *s, unsigned pos,
                                            unsigned new_bit_value)
{
    unsigned old_bit_value;

    assert((new_bit_value == 0) || (new_bit_value == 1));
    assert(pos < EXTI_LINE_COUNT);

    old_bit_value = GET_BIT_VALUE(s->EXTI_PR, pos);

    /* Only continue if the PR bit is actually changing value. */
    if(new_bit_value != old_bit_value) {
        /* If the bit is being reset, the corresponding Software Interrupt Event
         * Register bit is automatically reset.
         */
        if(!new_bit_value) {
            RESET_BIT(s->EXTI_SWIER, pos);
        }

        /* Update the IRQ for this EXTI line.  Some lines share the same
         * NVIC IRQ.
         */
        if(pos <= 4) {
            /* EXTI0 - EXTI4 each have their own NVIC IRQ */
            qemu_set_irq(s->irq[pos], new_bit_value);
        } else if(pos <= 9) {
            /* EXTI5 - EXTI9 share an NVIC IRQ */
            qemu_set_irq(s->irq[5], new_bit_value);
        } else if(pos <= 15) {
            /* EXTI10 - EXTI15 share an NVIC IRQ */
            qemu_set_irq(s->irq[6], new_bit_value);
        } else if(pos == 16) {
            /* PVD IRQ */
            qemu_set_irq(s->irq[7], new_bit_value);
        } else if(pos == 17) {
            /* RTCAlarm IRQ */
            qemu_set_irq(s->irq[8], new_bit_value);
        } else if(pos == 18) {
            /* OTG_FS_WKUP IRQ */
            qemu_set_irq(s->irq[9], new_bit_value);
        } else if(pos == 19) {
            /* ETH_WKUP IRQ */
            qemu_set_irq(s->irq[10], new_bit_value);
        } else if(pos == 20) {
            /* OTG_HS_WKUP IRQ */
            qemu_set_irq(s->irq[11], new_bit_value);
        } else if(pos == 21) {
            /* TAMP_STAMP IRQ */
            qemu_set_irq(s->irq[12], new_bit_value);
        } else if(pos == 22) {
            /* RTC_WKUP IRQ */
            qemu_set_irq(s->irq[13], new_bit_value);
        } else {
            assert(false);
        }

        /* Update the register. */
        CHANGE_BIT(s->EXTI_PR, pos, new_bit_value);
    }
}
Ejemplo n.º 2
0
/* Update a Trigger Selection Register (both the Rising and Falling TSR
 * registers are handled by this routine).
 */
static void update_TSR_bit(Stm32Exti *s, uint32_t *tsr_register, unsigned pos,
                                    unsigned new_bit_value)
{
    assert((new_bit_value == 0) || (new_bit_value == 1));
    assert(pos < EXTI_LINE_COUNT);

    if(new_bit_value != GET_BIT_VALUE(*tsr_register, pos)) {
        /* According to the documentation, the Pending register is cleared when
         * the "sensitivity of the edge detector changes.  Is this right??? */
        stm32_exti_change_EXTI_PR_bit(s, pos, 0);
    }
    CHANGE_BIT(*tsr_register, pos, new_bit_value);
}
Ejemplo n.º 3
0
Archivo: tty.c Proyecto: cosmos72/twin
static void set_mode(byte on_off) {
    dat i;
    
    for (i=0; i<=nPar; i++)
	
	/* DEC private modes set/reset */
	
	if (DState & ESques) switch (Par[i]) {
	    
	  case 1:	/* Cursor keys send ^[Ox/^[[x */
	    CHANGE_BIT(TTY_ALTCURSKEYS, on_off);
	    *Flags |= TTY_NEEDREFOCUS;
	    break;
	  case 3:	/* 80/132 mode switch unimplemented */
	    break;
	  case 5:	/* Inverted screen on/off */
	    CHANGE_BIT(TTY_INVERTSCR, on_off);
	    update_eff();
	    invert_screen();
	    break;
	  case 6:			/* Origin relative/absolute */
	    CHANGE_BIT(TTY_RELORIG, on_off);
	    goto_axy(0,0);
	    break;
	  case 7:			/* Autowrap on/off */
	    CHANGE_BIT(TTY_AUTOWRAP, on_off);
	    break;
	  case 8:			/* Autorepeat on/off */
	    break;
	  case 9: /* new style */
	    CHANGE_BIT(TTY_REPORTMOUSE, on_off);
	    CHANGE_BIT(TTY_REPORTMOUSE2, tfalse);
	    Act(ChangeField,Win)
		(Win, TWS_window_Attrib, WINDOW_WANT_MOUSE_MOTION|WINDOW_WANT_MOUSE,
		 on_off ? WINDOW_WANT_MOUSE : 0);
	    break;
	  case 25:			/* Cursor on/off */
	    Act(ChangeField,Win)
		(Win, TWS_window_Flags, WINDOWFL_CURSOR_ON, on_off ? WINDOWFL_CURSOR_ON : 0);
	    *Flags |= TTY_UPDATECURSOR;
	    break;
	  case 999: /* new style, report also motions */
	    CHANGE_BIT(TTY_REPORTMOUSE, on_off);
	    CHANGE_BIT(TTY_REPORTMOUSE2, on_off);
	    Act(ChangeField,Win)
		(Win, TWS_window_Attrib, WINDOW_WANT_MOUSE|WINDOW_WANT_MOUSE_MOTION,
		 on_off ? WINDOW_WANT_MOUSE|WINDOW_WANT_MOUSE_MOTION : 0);
	    break;
	  case 1000: /* classic xterm style */
	    CHANGE_BIT(TTY_REPORTMOUSE, tfalse);
	    CHANGE_BIT(TTY_REPORTMOUSE2, on_off);
	    Act(ChangeField,Win)
		(Win, TWS_window_Attrib, WINDOW_WANT_MOUSE|WINDOW_WANT_MOUSE_MOTION,
		 on_off ? WINDOW_WANT_MOUSE|WINDOW_WANT_MOUSE_MOTION : 0);
	    break;

	/* ANSI modes set/reset */
	} else switch (Par[i]) {
	    
	  case 3:			/* Monitor (display ctrls) */
	    CHANGE_BIT(TTY_DISPCTRL, on_off);
	    break;
	  case 4:			/* Insert Mode on/off */
	    CHANGE_BIT(TTY_INSERT, on_off);
	    break;
	  case 20:			/* Lf, Enter == CrLf/Lf */
	    CHANGE_BIT(TTY_CRLF, on_off);
	    break;
	}
}