Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1744576
  • 博文数量: 206
  • 博客积分: 1450
  • 博客等级: 上尉
  • 技术积分: 2285
  • 用 户 组: 普通用户
  • 注册时间: 2008-09-11 11:38
个人简介

学习永无止境!!

文章分类

全部博文(206)

文章存档

2022年(5)

2019年(3)

2018年(8)

2017年(32)

2016年(7)

2015年(13)

2014年(44)

2013年(24)

2011年(6)

2010年(17)

2009年(46)

2008年(1)

分类: 嵌入式

2010-05-17 16:16:29

    自己在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) |
给主人留下些什么吧!~~

wuyanyanke2014-06-08 04:00:39

是不是使用动态分配的问题呢?