收藏 分享(赏)

嵌入式原理与设计 第11章 嵌入式Linux驱动开发.ppt

上传人:weiwoduzun 文档编号:5756870 上传时间:2019-03-16 格式:PPT 页数:33 大小:829.50KB
下载 相关 举报
嵌入式原理与设计 第11章 嵌入式Linux驱动开发.ppt_第1页
第1页 / 共33页
嵌入式原理与设计 第11章 嵌入式Linux驱动开发.ppt_第2页
第2页 / 共33页
嵌入式原理与设计 第11章 嵌入式Linux驱动开发.ppt_第3页
第3页 / 共33页
嵌入式原理与设计 第11章 嵌入式Linux驱动开发.ppt_第4页
第4页 / 共33页
嵌入式原理与设计 第11章 嵌入式Linux驱动开发.ppt_第5页
第5页 / 共33页
点击查看更多>>
资源描述

1、第11章 嵌入式Linux驱动开发,第11章 嵌入式Linux驱动开发,11.1 串口及控制台驱动 11.2 FrameBuffer驱动 11.3 以太网络驱动 11.4 Linux驱动程序总结,11.1 串口及控制台驱动,串口及控制台驱动的作用 Linux串口驱动结构 Linux控制台驱动结构,串口及控制台驱动的作用,在嵌入式Linux中,控制台(console)是系统重要的输出设备。在通过Bootloader引导内核的时候,可以使用console=的命令行来指定控制台。当没有指定控制台的时候,系统利用第一个注册的终端设备(tty)作为系统的控制台。,串口及控制台驱动的作用,嵌入式处理器一般

2、都具有串口控制器(UART)。在嵌入式Linux,串口的地位非常重要,尤其在系统调试阶段,一切有用的信息都可以从串口输入到主机。,串口及控制台驱动的作用,Linux串口驱动结构,串口驱动程序的核心部分 : drivers/char/serial_core.h drivers/char/serial_core.c串口驱动(struct uart_driver)串口端口(struct uart_port)端口操作的数据结构(struct uart_ops)串口状态(struct uart_state),包含串口的 操作struct uart_ops,Linux串口驱动结构,结构体uart_driv

3、er是串口驱动程序的框架;结构体struct uart_port用于描述一个UART端口,其中包含到struct uart_ops的指针。结构体struct uart_ops是serial_core.h中定义的另外一个重要的数据结构,它表示对串口的操作;结构体struct uart_state表示串口的状态。,Linux控制台驱动结构,控制台的主要数据结构,在linux源代码的include/linux/console.h下。数据结构struct console定义Linux的控制台,console_cmdline定义了命令行中的控制台。在Linux内核启动的时候,使用console=指定的控

4、制台的名字就是使用console_cmdline类型结构体中的名字name8。,Linux控制台驱动结构,控制台命令行数据结构: struct console_cmdline char name8; /* 驱动的名称 */int index; /* 驱动次设备系引 */char *options; /* 驱动的可选项 */ ;,Linux控制台驱动结构,控制台数据结构: struct console char name8;void (*write)(struct console *, const char *, unsigned);int (*read)(struct console *, c

5、onst char *, unsigned);kdev_t (*device)(struct console *);void (*unblank)(void);int (*setup)(struct console *, char *);short flags;short index;int cflag;struct console *next; ;,控制台的写操作必须实现,为printk的输出所使用,读操作可以不实现。,setup 函数指针实现初始化的功能。,11.2 FrameBuffer驱动,LCD驱动原理 显示内存 FrameBuffer驱动结构,LCD驱动原理,LCD的含义为液晶显示

6、屏,在嵌入式系统中,通常使用处理器内部LCD控制器连接LCD完成显示工作。嵌入式系统中流行LCD主要包括两种类型:STN(Super Twisted Nematic,超扭曲向列型)被动型TFT(Thin Film Transistor,薄膜晶体管型)主动型,STN和TFT的LCD显示屏需要的驱动电平不同。,LCD驱动原理,嵌入式处理器的LCD控制器的共同点:LCD控制器集成在处理器芯片之中CPU通过读写LCD控制器的寄存器进行配置使用系统内存作为显示内存,显示内存一般由CPU写,有LCD控制器读。,LCD驱动原理,LCD的操作中,主要涉及到以下部件: LCD控制器(片内) LCD DMA(片内

7、) CPU(片内) 内存控制器(片内) 总线控制器(片内) LCD显示屏(片外) 内存(片外),DMA用于让LCD控制器访问内存。,LCD驱动原理,使用DMA方式读取显示内存,显示内存,FrameBuffer驱动结构,FrameBuffer的核心是一块供显示使用的内存,由系统中显示机构将显示内存中的内容显示到显示设备上。帧缓冲驱动本质上是一个字符设备(char device)的驱动,但是具有自己的框架。,FrameBuffer驱动结构,FrameBuffer接口常使用mmap和ioctl。,FrameBuffer驱动结构,在linux内核目录中include/linux/fb.h定义了Fram

8、eBuffer主要数据结构和接口。 屏幕信息数据结构: struct fb_info int node;int flags;struct fb_var_screeninfo var;struct fb_fix_screeninfo fix; /* */ ;,显示屏变量,显示屏固定量,FrameBuffer驱动结构,变化屏幕信息数据结构: struct fb_var_screeninfo _u32 xres; /* 可见分辨率 */_u32 yres;_u32 xres_virtual; /* 虚拟分辨率 */_u32 yres_virtual;_u32 xoffset; /* 虚拟到可见的偏移

9、量 */_u32 yoffset; _u32 bits_per_pixel; _u32 grayscale; /* 如果不为0灰度级代替彩色 */struct fb_bitfield red; /* 如果为真色彩代表帧缓冲的位域 */struct fb_bitfield green; /* 否则只有长度有意义 */struct fb_bitfield blue;struct fb_bitfield transp; /* 透明度 */* */ ;,可见显示屏大小,虚拟显示屏大小,虚拟显示屏偏移量,FrameBuffer驱动结构,FrameBuffer驱动结构,固定屏幕信息数据结构: struct

10、 fb_fix_screeninfo char id16; /* 辨识字符串 */unsigned long smem_start; /* 帧缓冲起始地址(物理地址) */_u32 smem_len; /* 帧缓冲内存的长度 */_u32 type; _u32 type_aux; /* 隔行扫描位平面的插入值 */_u32 visual; _u16 xpanstep; _u16 ypanstep; _u16 ywrapstep; _u32 line_length; /* 每行字节数 */unsigned long mmio_start; /* 内存映射I/O起始地址(物理地址)*/_u32 m

11、mio_len; /* 内存映射I/O的长度 */_u32 accel; /* 表示驱动的细节 */_u16 reserved3; /*为兼容保留 */ ;,FrameBuffer驱动结构,#define Width 640 #define Height 480int fd; unsigned char* framebuffer; fd = open (“/dev/fb0“, O_RDWR); framebuffer = mmap (NULL, Width*Height, PROT_READ|PROT_WRITE,MAP_SHARED,fd,0); /* 显示区域操作 */ /* */ clo

12、se(fd);,mmap将显示内存映射到用户空间,返回值为显示内存的首地址指针。,11.3 以太网络驱动,Linux以太网的应用 Linux网络驱动结构,Linux以太网的应用,以太网协议层次,Linux以太网的应用,NE2000以太网芯片,如:Realtek的RTL8019Cirrus Logic的CS8900,网络芯片和处理器,多使用总线方式相连,还需要中断引脚。,Linux网络驱动结构,Linux以太网的应用,网络驱动程序的核心数据结构struct net_device在/include/linux目录的netdevice.h中定义,其成员比较多。 struct net_device c

13、har nameIFNAMSIZ;/* . . */unsigned long mem_end;unsigned long mem_start;unsigned long base_addr;unsigned int irq; /* . . */unsigned char if_port;unsigned char dma;unsigned long state;struct net_device *next; int (*init)(struct net_device *dev);/* . . */ ,驱动程序的初始化函数,Linux以太网的应用,net_device部分成员,Linux以太网的应用,网络驱动的初始化函数在网络设备注册后,使用其init函数指针完成。,网络驱动的使用hard_start_xmit函数指针实现数据的发送,注册中断实现数据接收。,11.4 Linux驱动程序总结,在Linux操作系统中,驱动程序是操作系统(OS)和硬件(hardware)的接口。在Linux中,驱动程序是一种框架,既有最简单的字符设备驱动程序,也有串口、帧缓冲,以太网以及IIC、各种存储器多种多样的驱动程序框架。 数据结构 初始化 功能实现,课程结束,

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 企业管理 > 经营企划

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报