mini2440 led驱动 gpio接口连线

问题描述

mini2440 led驱动 gpio接口连线
mini2440开发板linux系统下的控制led实验,控制用户led,分别对应的是gpb5、gpb6、gpb7、gpb8,成功了。
随后我修改驱动程序代码,改为控制gpb1、gpb6、gpb7、gpb8,用杜邦线连接gpb1,连接一个led,在终端输入控制命令
“开led”和“关led”,结果不能控制连接着gpb1的led,其余三个用户led正常,测量了gpb1和gnd的电压,在“开led”和“关led”两种命令下,
其电压均为3v左右。随后我又修改驱动程序代码,改为控制gpb0和gpb6、gpb7、gpb8,gpb0是连接着内部蜂鸣器的,在终端输入控制命令“开led”和“关led”,
可以控制蜂鸣器的开和关。在“开led”和“关led”的两种命令下。其对应的电压分别为1.6v和0v。为啥我只是修改了引脚代码,就不能控制其他端口呢?

解决方案

解决方案二:
mini2440的led接了4个GPIO,分别是GPB5-8

关于这几个GPIO的寄存器描述可以看三星的文档,主要是GPBCONGPBDAT和GPBUPGPBCON寄存器可以表示某引脚是输入功能还是输出功能,因为这些引脚是复用的。GPBDAT用来给某引脚读写数据的。GPBUP表示是否使用内部上拉电阻,这里没有用上,貌似,不懂。

linux对ARM支持很好,有关gpio的操作都有函数写好了,直接用就可以。

以前真是傻呀,自己写,呵呵。

linux/arch/arm/plat-s3c24xx/gpio.c描述了对gpio的操作,这里用到两个函数:

s3c2410_gpio_cfgpin(led_table[i] led_cfg_table[i]);

s3c2410_gpio_setpin(led_table[i] 0);

第一个函数是设置led_table[i]表示的引脚为输入或者输出(led_cfg_table[i]定义的),其实就是设置GPBCON寄存器;

第二个函数是设置引脚读写数据为0或者其他值,比如1.

led_table[i] led_cfg_table[i]在这个文件里都有定义,定义中涉及的宏S3C2410_GPB6 和S3C2410_GPB6_OUTP 之类都在arch/arm/mach-s3c2410/include/mach/regs-gpio.h中定义好了。

下面的就是LED的驱动程序:

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#define DEVICE_NAME ""leds"" 设备名

static unsigned long led_table [] = { 4个对应的引脚

S3C2410_GPB5S3C2410_GPB6S3C2410_GPB7S3C2410_GPB8

};

static unsigned int led_cfg_table [] = { 引脚功能都是输出

S3C2410_GPB5_OUTPS3C2410_GPB6_OUTPS3C2410_GPB7_OUTPS3C2410_GPB8_OUTP

};

static int sbc2440_leds_ioctl( ioctl具体实现,对应应用程序中的ioctl

struct inode *inode struct file *file   这个参数对应应用程序中的第一个参数,文件unsigned int cmd 两个值,0或1,led灭或者亮unsigned long arg)  参数个数,不能超过4,表示只有4个led

{

switch(cmd) {case 0:case 1:    if (arg > 4) {        return -EINVAL;    }    s3c2410_gpio_setpin(led_table[arg] !cmd); 设置某个led数据0或1    return 0;default:    return -EINVAL;}

}

file_operations 数据结构填充

static struct file_operations dev_fops = {

.owner    =    THIS_MODULE.ioctl    =    sbc2440_leds_ioctl对应的ioctl函数实现

};

misc设备,也就是非字符,非块,非网络,其他设备。这种设备统一采用一个主设备号

static struct miscdevice misc = {

.minor = MISC_DYNAMIC_MINOR 次设备号.name = DEVICE_NAME.fops = &dev_fops

};

static int __init dev_init(void) 初始化设备

{

int ret;int i;for (i = 0; i < 4; i++) {   设置引脚为输出功能    s3c2410_gpio_cfgpin(led_table[i] led_cfg_table[i]);   各引脚写入0,即都是不亮的    s3c2410_gpio_setpin(led_table[i] 0);}ret = misc_register(&misc); 注册misc设备printk (DEVICE_NAME""tinitializedn"");return ret;

}

static void __exit dev_exit(void)

{

misc_deregister(&misc);  注销misc设备

}

module_init(dev_init);

module_exit(dev_exit);

MODULE_LICENSE(""GPL"");

MODULE_AUTHOR(""FriendlyARM Inc."");

led的应用程序如下:
#include

#include

#include

#include

int main(int argc char **argv) 带参数,一共是三个

{

int on;int led_no;int fd;//if条件表示,有三个参数,on的值只能是0或者1,led_no的值只能是0-3//sscanf的返回值为0,出错,否则返回正确格式化数据的个数,这样就确保main参数每个都读的争取if (argc != 3 || sscanf(argv[1]%d"" &led_no) != 1 || sscanf(argv[2]%d"" &on) != 1 || on < 0 || on > 1 || led_no < 0 || led_no > 3) {    fprintf(stderrUsage: leds led_no 0|1n"");    exit(1);}fd = open(""/dev/leds0"" 0);  不知道什么意思?if (fd < 0) {    fd = open(""/dev/leds"" 0); 读取设备}if (fd < 0) {    perror(""open device leds"");    exit(1);}ioctl(fd on led_no);  调用ioctl,和驱动里的对应。不过那个ioctl函数貌似四个参数,第一个参数是inode节点,后面三个和这里是对应的,有点茫然。close(fd);return 0;

}

交叉编译后,执行:

#./led 2 1

第三个led亮

时间: 2024-11-02 22:44:01

mini2440 led驱动 gpio接口连线的相关文章

GPIO接口解析【转】

本文提供了一个linux下访问GPIO的约定的概述. 这些调用使用gpio_* 命名前缀.没有别的调用会使用这个前缀或是相关的__gpio_*前缀. 转自:http://blog.163.com/w541097221@126/blog/static/9550215201472152343989/   什么是GPIO? =============== GPIO----"通用目的输入/输出端口"----是一个灵活的软件控制的数字信号.许多种类的芯片都会提供,嵌入式linux开发者和硬件定制

《Linux设备驱动开发详解 A》一一1.6 设备驱动Hello World:LED驱动

1.6 设备驱动Hello World:LED驱动 1.6.1 无操作系统时的LED驱动 在嵌入式系统的设计中,LED一般直接由CPU的GPIO(通用可编程I/O)口控制.GPIO一般由两组寄存器控制,即一组控制寄存器和一组数据寄存器.控制寄存器可设置GPIO口的工作方式为输入或者输出.当引脚被设置为输出时,向数据寄存器的对应位写入1和0会分别在引脚上产生高电平和低电平:当引脚设置为输入时,读取数据寄存器的对应位可获得引脚上的电平为高或低. 在本例子中,我们屏蔽具体CPU的差异,假设在GPIO_

《Linux 设备驱动开发详解(第2版)》——1.6 设备驱动Hello World:LED驱动

1.6 设备驱动Hello World:LED驱动 Linux 设备驱动开发详解(第2版)1.6.1 无操作系统时的LED驱动 在嵌入式系统的设计中,LED一般直接由CPU的GPIO(通用可编程I/O口)控制.GPIO一般由两组寄存器控制,即一组控制寄存器和一组数据寄存器.控制寄存器可设置GPIO口的工作方式为输入或是输出.当引脚被设置为输出时,向数据寄存器的对应位写入1和0会分别在引脚上产生高电平和低电平:当引脚设置为输入时,读取数据寄存器的对应位可获得引脚上的电平为高或低. 在本例子中,我们

Windows CE S3C440A LED驱动编码分析

      基于TQ2440硬件平台,该平台处理器S3C2440A,在这个平台当中存在四个LED,用于测试,显示其他硬件运行情况等.LED驱动是一个典型的I/O驱动,简单但健全,是学习Windows CE嵌入式平台的典型例子.首先我们来看看这个平台这这部分电路图吧!           这四个LED分别加了1K偶的电阻,另一端接3.3V电压,接下来看看核心板的接口.       从这里可以看住,这四个LED分别由GPB5.GPB6.GPB7和GPB8控制,都处于B组GPIO口.接下来介绍具体的编

led驱动-求教各位朋友关于 LED驱动的问题!

问题描述 求教各位朋友关于 LED驱动的问题! 你好,我是新人,想通过LED灯驱动来了解和加深对驱动和内核的理解.现在有个关于LED灯驱动的问题,想请教高手帮忙. 先说下我的任务: LED灯驱动完成后,给用户空间暴露 status led1 led2 led3 led4 led5 led6 led7 8个文件. 举个例子,假设你的驱动挂上后,在/sys/bus/i2c/drivers/ewtsa/4-0068/下面, 则在该目录下应该有status led1 led2 led3 led4 led

WM-17U读卡器器驱动及接口

问题描述 WM-17U读卡器器驱动及接口谁有,提供一下万分感谢.最好也有开发文档.今晚发出来再加分 解决方案 解决方案二:百度一下,解决方案三:或者直接打厂家客服电话更快,解决方案四:厂家都是免费提供的

led驱动加载-开发板和ubuntu互ping的问题

问题描述 开发板和ubuntu互ping的问题 遇到一个很奇怪的问题,开发板一加载led驱动以后,就和ubuntu ping不通了,加载之前是互通的,很困扰,不知道是驱动的问题,还是别的问题.请各位大侠帮帮忙.

基于ARM_contexA9 led驱动编程

关于友善之臂出的这款contexA9开发板,目前在网络上的资源较少,特别是内核的,非常之少,鉴于这种情况,我将会写一个系列的驱动来做关于tiny4412这款板子开发的总结.      简单介绍一下: Tiny4412是一款高性能的四核Cortex-A9核心板,由广州友善之臂设计.生产和发行销售.它采用三星Exynos4412作为主处理器,运行主频可高达1.5GHz,Exynos4412内部集成了Mali-400 MP高性能图形引擎,支持3D图形流畅运行,并可播放1080P大尺寸高清视频.三星旗舰

gpio 驱动-gpio设置为输入 驱动怎么写

问题描述 gpio设置为输入 驱动怎么写 0k2440的板子,想设置一个gpio口(例如,GPB6)为输入,读取输入电平,驱动怎么写,业余刚入门,请各位大侠帮帮忙,急,谢谢了.