linux串口终端驱动——s3c6410平台(二)

发布者:ShiningSmile最新更新时间:2022-06-15 来源: eefocus关键字:linux 手机看文章 扫描二维码
随时随地手机看文章

1、终端设备

在Linux系统中,终端是一种字符型设备,它有多种类型,通常使用tty来简称各种类型的终端设备。tty是Teletype的缩写,Teletype是最早出现的一种终端设备,很像电传打字机,是由Teletype公司生产的。


Linux中包含如下几类终端设备:


   1).串行端口终端(/dev/ttySn)

使用计算机串行端口连接的终端设备。串行端口对应的设备名称是/dev/ttySn。如/dev/ttyS0、/dev/ttyS1等,设备号分别是(4,0)、(4,1)

   2).伪终端(/dev/pty/)

   显示器通常称为控制台终端,若当前进程有控制终端,则/dev/tty就是当前进程的控制终端的设备特殊文件。可以使用命令“ps-ax”查看进程与哪个控制终端相连,使用命令“tty”查看它具体对应哪个实际终端设备。

    3).控制台终端(/dev/ttyn, /dev/console)


2、Linux内核tty层次结构


(1)、tty线程规程


     以特殊的方式格式化从一个用户或者硬件收到的数据,这种格式化常常采用一个协议转换的形式,如PPP、Bluetooth。


(2)、tty设备发送数据流程


    tty核心从一个用户获取将要发送给一个tty设备的数据,tty核心将数据传递给tty线路规程驱动,接着数据被传递到tty驱动,tty驱动将数据转换为可以发送的硬件格式。


(3)、tty设备接收数据流程


   从tty硬件接收到的数据向上交给tty驱动,进入tty线路规程驱动,再进入tty核心,在此被用户获取。尽管tty核心与tty之间的数据传输会经历tty线路规程的转换,但是tty驱动与tty核心之间也可以直接传输数据。


(4)、上图第一部分,因为终端是一种字符设备,所以要按字符设备的要求来注册,并有对应的file_operations结构体,用于对设备进行操作。


注册的方法有两种:


(1)、在drivers/char/Tty_io.c中定义:


static const struct file_operations tty_fops = {

.llseek  = no_llseek,

.read = tty_read,

.write  = tty_write,

.poll = tty_poll,

.unlocked_ioctl= tty_ioctl,

.compat_ioctl  = tty_compat_ioctl,

.open = tty_open,

.release  = tty_release,

.fasync  = tty_fasync,

};


此结构体在下面初始化函数中被赋值给对应的字符设备tty




可以在注册tty_driver结构体实例时进行,一般用此方法。


/*


 * Called by a tty driver to register itself.

 */

int tty_register_driver(struct tty_driver *driver)

{

int error;

int i;

dev_t dev;

void **p = NULL;



if (!(driver->flags & TTY_DRIVER_DEVPTS_MEM) && driver->num) {

p = kzalloc(driver->num * 2 * sizeof(void *), GFP_KERNEL);

if (!p)

return -ENOMEM;

}



if (!driver->major) {

error = alloc_chrdev_region(&dev, driver->minor_start,

driver->num, driver->name);

if (!error) {

driver->major = MAJOR(dev);

driver->minor_start = MINOR(dev);

}

} else {

dev = MKDEV(driver->major, driver->minor_start);

error = register_chrdev_region(dev, driver->num, driver->name);

}

if (error < 0) {

kfree(p);

return error;

}



if (p) {

driver->ttys = (struct tty_struct **)p;

driver->termios = (struct ktermios **)(p + driver->num);

} else {

driver->ttys = NULL;

driver->termios = NULL;

}



cdev_init(&driver->cdev, &tty_fops);

driver->cdev.owner = driver->owner;

error = cdev_add(&driver->cdev, dev, driver->num);

if (error) {

unregister_chrdev_region(dev, driver->num);

driver->ttys = NULL;

driver->termios = NULL;

kfree(p);

return error;

}



mutex_lock(&tty_mutex);

list_add(&driver->tty_drivers, &tty_drivers);

mutex_unlock(&tty_mutex);



if (!(driver->flags & TTY_DRIVER_DYNAMIC_DEV)) {

for (i = 0; i < driver->num; i++)

   tty_register_device(driver, i, NULL);

}

proc_tty_register_driver(driver);

driver->flags |= TTY_DRIVER_INSTALLED;

return 0;

}


关键字:linux 引用地址:linux串口终端驱动——s3c6410平台(二)

上一篇:linux串口终端驱动——s3c6410平台(四)
下一篇:linux串口终端驱动——s3c6410平台(三)

推荐阅读最新更新时间:2024-11-11 11:44

linux下的ARM看门狗程序
由于LINUX下应用层不能直接访问寄存器,只要通过驱动程序作为桥梁 // 驱动程序: #ifndef __KERNEL__ #define __KERNEL__ #endif #ifdef MODULE #define __MODULE__ #endif #include module.h #include linux/fs.h #include linux/iobuf.h #include linux/major.h #include linux/blkdev.h #include linux/capability.h #include linux/smp_lock.h #include asm/uaccess.h #incl
[单片机]
S3C2440移植linux3.4.2内核之内核框架介绍及简单修改
uboot启动内核分析 进入cmd_bootm.c,找到对应的bootm命令对应的do_bootm(): int do_bootm(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv ) { boot_os_fn *boot_fn; //boot_fn是个数组函数 ... .. boot_fn(0, argc, argv, &images); //调用数组函数 ... ... } boot_os_fn是个typedef型,如下图所示: 由于定义了宏CONFIG_BOOTM_LINUX,最终会跳转到do_bootm - do_bootm_linu
[单片机]
Linux-2.6.32.2内核在mini2440上的移植(十五)---移植LED驱动
移植环境 1,主机环境:VMare下CentOS 5.5 ,1G内存。 2,集成开发环境:Elipse IDE 3,编译编译环境:arm-linux-gcc v4.4.3,arm-none-linux-gnueabi-gcc v4.5.1。 4,开发板:mini2440,2M nor flash,128M nand flash。 5,u-boot版本:u-boot-2009.08 6,linux 版本:linux-2.6.32.2 7,参考文章: 嵌入式linux应用开发完全手册,韦东山,编著。 Mini2440 之Linux 移植开发实战指南 嵌入式Linux之我行——LED驱动在2440上的实例开发 【1】LED 驱动原
[单片机]
<font color='red'>Linux</font>-2.6.32.2内核在mini2440上的移植(十五)---移植LED<font color='red'>驱动</font>
arm-linux-gcc 裸机程序开发(一)
以前开发arm裸机程序都是在ADS1.2开发环境下编译和调试的。刚开始时初学嵌入式好多东西不懂,选择这个开发环境的理由,一是资料多的,mini2440开发板上提供了很多例程可以参考,网上几乎所有arm裸机程序都是基于ADS1.2开发的。二是开发环境友善,虽然后来感觉ADS1.2有点难用,但毕竟是IDE的环境,对初学者来说总比命令行的方式更加直观与方便。随着学习的深入,感觉它就像傻瓜相机一样,虽然好用但屏蔽了很多内容,影响了我们深入理解代码编译以及链接的细节。而且ADS对于程序的开发没有GNU工具链灵活。这段时间因为需要,又要编写一些arm裸机程序。自己已经用Linux习惯了,不想再切回windows下工作了。所以,最近对linux
[单片机]
黑客将任天堂Switch变成了一个Linux平板电脑
    许多人都可以想到一个主要原因来破解一台游戏主机。很明显,你可以在破解主机上玩盗版游戏。   这就是为什么现代的游戏机很难被破解的原因,因为盗版游戏涉及到成千上万的收入。   但是有些人只是想在他们自己的硬件上运行他们选择的软件。对于那些人来说,Linux on the Switch是一个巨大的成就。   几个星期前,fail0verflow黑客集体在Twitter上推出了一个启动Linux的Nintendo Switch的提议。   现在终于有了结果,fail0verflow有一个完整版的Linux发行版的视频,它运行在被黑的Switch上,支持触摸屏,一个完全可操作的web浏览器,甚至还有一个GPU驱动的演示应用程序。
[手机便携]
ARM Linux开发阶段性总结
简介:从我开始搞Linux,我就一直在网上或者图书馆中寻找“HOWTO”性质的文章,遗憾的是还真少。我也希望我的Blog成为我做的这块板子的“HOWTO”大全,呵呵。但是今天我不写“HOWTO”,对我的工作来个概括性的总结。 这一个月来,我一直投身于Linux内核移植的伟大而光荣的事业,相当的痛苦了…… 不过收获也是很大的,昨天晚上,哦应该是今天凌晨12:00,终于我的板子上出现了Busybox启动的好消息。Linux内核的移植终于取得了阶段性的成果,虽然后面的路还很长。 从我开始搞Linux,我就一直在网上或者图书馆中寻找“HOWTO”性质的文章,遗憾的是还真少。我也希望我的Blog成为我做的这块板子的“HOWTO”大全
[单片机]
Linux爆核心漏洞,让黑客能拦截未加密流量
    资安研究人员发现用以改善TCP安全传输的RFC5961存在漏洞,让骇客可释出假封包争夺共享资源,藉探测计数器变化推测两个主机是否正以TCP通讯及封包的排序,从而拦截未加密的流量,危及网路安全及隐私。受影响的包括v3.6至v4.7的所有Linux核心版本。 来自加州大学河滨分校(University of California, Riverside)与美国陆军研究实验室(US Army Research Laboratory)的6名研究人员在本周举行的Usenix安全研讨会上揭露了一个攸关RFC 5961的安全漏洞,RFC 5961是一项用来改善TCP传输安全的标准,却带来了新漏洞,允许骇客拦截未加密的流量,波及自v
[手机便携]
嵌入式linux面试题解析(一)——ARM部分一
1、FIQ比IRQ快的原因: A、FIQ模式的R8–R14寄存器是独有的,FIQ处理程序可以不必执行保存和恢复中断现场的指令。 B、FIQ可以将ISR直接放在FIQ后面的地址空间,不需要跳转。 2、中断与异常有何区别 异常在处理的时候必须考虑与处理器的时钟同步,实际上异常也称为同步中断,在处理器执行到因编译错误而导致的错误指令时,或者在执行期间出现特殊错误,必须靠内核处理的时候,处理器就会产生一个异常;所谓中断是指外部硬件产生的一个电信号从CPU的中断引脚进入,打断CPU的运行。所谓异常是指软件运行过程中发生了一些必须作出处理的事件,CPU自动产生一个陷入来打断CPU的运行。 3、在ARM系统中,在函数调用的时候,参数是通
[单片机]
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
  • 学习ARM开发(16)
    ARM有很多东西要学习,那么中断,就肯定是需要学习的东西。自从CPU引入中断以来,才真正地进入多任务系统工作,并且大大提高了工作效率。采 ...
  • 学习ARM开发(17)
    因为嵌入式系统里全部要使用中断的,那么我的S3C44B0怎么样中断流程呢?那我就需要了解整个流程了。要深入了解,最好的方法,就是去写程序 ...
  • 学习ARM开发(18)
    上一次已经了解ARM的中断处理过程,并且可以设置中断函数,那么它这样就可以工作了吗?答案是否定的。因为S3C44B0还有好几个寄存器是控制中 ...
  • 嵌入式系统调试仿真工具
    嵌入式硬件系统设计出来后就要进行调试,不管是硬件调试还是软件调试或者程序固化,都需要用到调试仿真工具。 随着处理器新品种、新 ...
  • 最近困扰在心中的一个小疑问终于解惑了~~
    最近在驱动方面一直在概念上不能很好的理解 有时候结合别人写的一点usb的例子能有点感觉,但是因为arm体系里面没有像单片机那样直接讲解引脚 ...
  • 学习ARM开发(1)
  • 学习ARM开发(2)
  • 学习ARM开发(4)
  • 学习ARM开发(6)
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved