LDD 8 How to write uart interrupt driver - limingth/LASO GitHub Wiki

uart interrupt driver

linux-2.6.35.7/arch/arm/plat-s5p/include/plat/irqs.h

IRQ_S5P_UART_RX0 16
IRQ_S5P_UART_ERR0 17
IRQ_S5P_UART_TX0 18

IRQ_S5P_UART_RX1 20
IRQ_S5P_UART_ERR1 21
IRQ_S5P_UART_TX1 22

IRQ_S5P_UART_RX2 24
IRQ_S5P_UART_ERR2 25
IRQ_S5P_UART_TX2 26

IRQ_S5P_UART_RX3 28
IRQ_S5P_UART_ERR3 29
IRQ_S5P_UART_TX3 30

arch/arm/mach-s5pv210/include/mach/irqs.h

UART3 read interrupt enable

get puart to UART3 SFR

puart = ioremap(0xe2900c00)

SFR setting

puart->ulcon = 0x3;
puart->ucon = 0x7C5;
puart->ubrdiv = 0x23;
puart->udivslot = 0x808;

set irq type (optional)

#include <linux/irq.h>
set_irq_type();

request irq

#include <linux/interrupt.h>
request_irq(0x28, handler, 0, "read_irq", NULL);

init wait queue

init_waitqueus_head(&q);

UART3 write interrupt enable

request_irq(0x30, handler, 0, "write_irq", NULL);
uart_write()
    charbuf = c;
    enable_irq(UART_TX);
write_handler()
    puart->utxh = charbuf;
    disable_irq_nosync(UART_TX);  // ok!
    disable_irq(UART_TX);   // could sleep the process, Do NOT use it!