自己在linux-2.4下使用串口接收键盘输入时。在不自动使用rc启动时,通过命令行打开程序时,可以顺利打开串口,接收数据。可是使用rc使程序自运行时,总是在open设备时,报没有此设备。
代码如下:fd=open("/dev/ttyS0",O_RDWR | O_NOCTTY | O_NONBLOCK))
自己在dev下使用:mknod ttyS0 c 4 0建立设备节点
经过自己的精心查找busybox和内核启动代码发现,在自启动中没有第二次调用tty 的ioctl所致。以至于在自己的程序中open时,
在内核中的tty_open代码:
static int tty_open(struct inode * inode, struct file * filp)
{
struct tty_struct *tty;
int noctty, retval;
kdev_t device;
unsigned short saved_flags;
char buf[64];
saved_flags = filp->f_flags;
retry_open:
noctty = filp->f_flags & O_NOCTTY;
device = inode->i_rdev;
if (device == TTY_DEV) {
if (!current->tty)
return -ENXIO;——————〉退出位置
device = current->tty->device;
filp->f_flags |= O_NONBLOCK; /* Don't let /dev/tty block */
/* noctty = 1; */
}
经过仔细研究分析,原来是mknod设备主设备和此设备号有问题。
有启动命令consle=ttyS0,通过研究8250.c发现主次设备好分别为:4和64。最后在dev下应用mknod ttyS0 c 4 64建立设备节点,编译ramdisk,奇迹出现了,串口居然可以打开并接收数据了。
经过这几天的研究个人认为:串口应该根据启动命令行,然后查看内核驱动程序确认主次设备号,才可以正确mknod建立设备节点,进而正确open设备。
阅读(2799) | 评论(1) | 转发(0) |