每个GPIO端口至少需要两个寄存器,一个是用于控制的“通用I/O端口控制寄存器”,一个是存放数据的“通用I/O端口数据寄存器”。控制和数据寄存器的每一位和GPIO的硬件引脚相对应,由控制寄存器设置每一个引脚的数据流向,数据寄存器设置引脚输出的高低电平或读取引脚上的电平。S5PV210共有237个GPIO端口,分成15组。GPP1:低功率I2S、PCM。GPIO的15组引脚除了作为输入、输出引脚外,一般都还有其他功能,称为引脚复用。图4.6GPIO端口功能框图......
2023-11-19
I/O接口是微控制器的最基本功能之一。I/O接口电路简称接口电路,它是主机和外围设备之间交换信息的连接部件。I/O接口在主机和外围设备之间的信息交换中起着桥梁和纽带作用。I/O接口电路不仅解决主机CPU和外围设备之间的时序配合和通信联络问题,还可以解决CPU和外围设备之间的数据格式转换和匹配问题,也可以解决CPU的负载能力和外围设备端口选择问题。ARM系统完成I/O功能的标准方法是使用存储器映射I/O。这种方法使用特定的存储器地址。当从这些地址加载或向这些地址存储时,它们提供I/O功能。典型情况下,从存储器映射I/O地址加载用于输入,而向存储器映射I/O地址存储用于输出。
“通用输入输出”(General Purpose Input Output,GPIO)是嵌入式系统中最简单、最常应用的1/O接口。GPIO是一组可编程控制的引脚,由多个寄存器同时控制。通过设置对组的寄存器可以达到设置GP1O口对应状态与功能,如读取数据状态、设置输入输出方向、清零、中断使能等功能。常见的一些设计如点亮LED、控制蜂鸣器、输出高低电平、检测按键等设计都可以通过GPO口完成。GPIO接口的优点是低功耗、小封装、低成本和具有较好的灵活性。应用程序都能够通过相应的接口使用GPIO。GPIO使用0~MAX INT之间的整数标识,不能使用负数。
GPIO驱动主要作用就是读取GPIO口的内容,或者设置GPIO口的状态。GPIO与硬件体系密切相关,在Linux内核目录下的相关文件中我们可以发现针对不同硬件芯片的GPIO定义和使用方法,如本书涉及的S5PV210芯片Linux内核中也有相应的驱动程序支持(在/drivers/gpio/)。当然,Linux内核也提供了一个模型框架,能够使用统一的接口来操作GPIO,这个架构被称gpiolib,系统通过gpiolib.c文件来描述该架构。说明文档可见documention/gpio.txt。(www.chuimin.cn)
本章主要讲的就是如何使用Linux内核封装好的GPIO接口函数在驱动开发中需要操作GPIO时候的使用。
有关ARM嵌入式系统原理与应用的文章
每个GPIO端口至少需要两个寄存器,一个是用于控制的“通用I/O端口控制寄存器”,一个是存放数据的“通用I/O端口数据寄存器”。控制和数据寄存器的每一位和GPIO的硬件引脚相对应,由控制寄存器设置每一个引脚的数据流向,数据寄存器设置引脚输出的高低电平或读取引脚上的电平。S5PV210共有237个GPIO端口,分成15组。GPP1:低功率I2S、PCM。GPIO的15组引脚除了作为输入、输出引脚外,一般都还有其他功能,称为引脚复用。图4.6GPIO端口功能框图......
2023-11-19
GPIO属于字符设备,其驱动可以归类为Linux设备驱动的字符设备驱动。编写一个程序gpio_led.c,实现对实验箱CVT_A8上连接在GPIO端口的LED驱动程序,使得实验箱上的发光二极管轮流点亮,既常见的流水灯。既然是这样,则编写设备驱动程序的主要工作就是编写子函数,并填充file_operations的各个域。函数分别为device ioctl并在模块初始化函数dev init中调用misc register函数进行注册ioctl操作函数实现。模块退出操作模块退出,必须删除设备驱动程序并释放占用的资源,使用unregister_chrdev删除设备驱动程序。......
2023-11-19
每组GPIO端口都有两类控制寄存器,分别工作在正常模式和掉电模式。S5PV210处理器工作在正常模式下时,正常寄存器工作;进入掉电模式时,所有配置和上拉/下拉控制由掉电寄存器控制。用于控制GPIO的引脚功能,向该寄存器写入数据来设置相应引脚是输入/输出,还是其他功能。GPIO数据寄存器GPxnDAT。GPIO上拉/下拉寄存器GPxnPUD,用于控制每个端口上拉/下拉电阻的使能/禁止。......
2023-11-19
因此,驱动程序的设计,要求开发人员熟悉Linux的内核机制、驱动程序和用户级应用程序的接口关系、系统中对设备的并发操作,同时要求开发人员非常熟悉所开发硬件的工作原理。嵌入式Linux中的设备驱动程序有以下三个方面的特点。......
2023-11-19
上面介绍了字符设备驱动程序的重要的数据结构,那么如何设计一个字符设备驱动程序的数据结构?字符设备驱动程序的初始化流程一般可以用如下的过程来表示:定义相关的设备文件结构体[如file_operation()中的相关成员函数的定义]。向内核申请主设备号。内核提供了三个函数来注册一组字符设备编号,这三个函数分别是:alloc_chrdev_region()、register_chrdev_region()和register_chrdev()。所以在一般的字符设备驱动程序中,不会看到对cdev的操作。这里举出字符设备驱动程序的常见的两种编程架构。......
2023-11-19
用户应用程序调用设备的功能都是在设备驱动程序中定义的,也就是设备驱动程序中所定义的功能入口点函数。struct file_operations{};struct inode{};struct file{};编写设备驱动程序,很大一部分工作就是“填写”结构体中定义的函数。取得目录入口点,只用于与文件系统相关的设备驱动程序。一般编写设备驱动程序时并不一定要全部定义以上函数,只需定义对设备有意义的接口函数。fie结构主要是与文件系统对应的设备驱动程序使用。......
2023-11-19
2.开发模式嵌入式系统本身不具备自举开发能力,即使设计完成以后用户通常也是不能对其中的程序功能进行修改的,必须有一套开发工具和环境才能进行开发,这些工具和环境一般是基于通用计算机上的软硬件设备以及各种逻辑分析仪、混合信号示波器等。表1.2常用嵌入式开发工具......
2023-11-19
Linux软件开发一直在Internet环境下讲行。Linux开发工作经常是在Linux用户决定共同完成一个项目时开始的。由于这个活跃的开发环境,新的以Linux为基础的软件功能日益强大,而且呈现爆炸式的增长态势。许多流行的Linux实用程序如C编译器、shell和编辑器都是GNU软件应用程序。Linux程序需要首先转化为低级机器语言即所谓的二进制代码以后,才能被操作系统执行。......
2023-11-19
相关推荐