我已经使用interrupt编写了一个简单的UART驱动程序。现在我只传输数据。
用户空间中的write函数将数据复制到内核空间中的缓冲区。
现在在中断期间,内核空间中的数据从内核空间以字节方式(100次)复制到THR缓冲寄存器。
但是在中断处理程序完成它之前,close函数中的调试语句会被打印出来。这不是错误的方式吗?即我希望在处理函数的语句之后打印close函数的调试语句
下面的代码是处理函数,这个处理函数在copyfromuser函数
之后启用irqreturn_t uart_handler(int irq, void *dev_id)
{
write_to_uart(bytes_written);
printk(KERN_ALERT "index %d\n", Uindex);
if (Uindex >= 100)
iowrite32(0,io_map + 0x4);//IER THR disable
printk(KERN_ALERT "out from if\n");
return IRQ_HANDLED;
}
以下代码是write_to_uart
void write_to_uart(int nofbytes)
{
if (((ioread32(io_map + 0x8)) & 0x2) == 0x2) {
printk(KERN_ALERT "Interrupt activated\n");
iowrite32((unsigned)((device_buffer)[Uindex]), io_map);
Uindex++;
} else {
printk(KERN_ALERT "Interrupt not activated\n");
printk(KERN_ALERT "IIR reg = %d\n", ioread32(io_map + 0x8));
}
}
关闭功能无效
int uart_release(struct inode *inode, struct file *filp)
{
printk(KERN_ALERT "DEVICE CLOSED\n");
return 0;
}
答案 0 :(得分:1)
由于中断处理程序中没有能够阻止write(2)
调用的代码,因此数据将异步发送到UART。假设您在写入数据后(从用户空间感知)继续close(2)
文件描述符;你所描述的行为正是我期望看到的。
如果您不想阻止写入,请查看completions。
旁注;你有什么理由不能在内核中使用标准的8250/16550驱动程序吗?