⑴ 求教linux下的gpio输入驱动的一点问题
ker_buf[0] =gpio_get_value(LED_GPIO_1); //获取管脚上的值
在这后面加一条printk语句,将ker_buf[0]的值打印出来,判断读取的值有没有问题?
如果读出来一直是0,那你就检查IO口的配置有没有问题!
if (_to_user(buf, ker_buf, 2)) //数据从内核空间往用户空间的拷贝
return -EFAULT;
这条语句,你第一贴得代码是2,后面那次是对的
⑵ 嵌入式Linux中如何实现应用程序与驱动程序函数接口问题,以GPIO为例
嵌入式Linux中如何实现应用程序与驱动程序函数接口问题,以GPIO为例
驱动中的函数定义:
static int sbc2440_leds_ioctl(
struct inode *inode,
struct file *file,
unsigned int cmd,
unsigned long arg)
{
switch(cmd) {
case 0:
case 1:
if (arg > 4) {
return -EINVAL;
}
s3c2410_gpio_setpin(led_table[arg], !cmd);
return 0;
default:
return -EINVAL;
}
}
应用程序中的函数定义:
ioctl(fd, on, led_no);
不明白的地方是函数名都不一样,应用程序中的ioctl函数是如何将参数传递到驱动程序sbc2440_leds_ioctl中的?
xicain
⑶ 嵌入式linux中编写驱动程序的时候用到的头文件问题
#include <linux/mole.h> 模块头文件
#include <linux/kernel.h> 驱动要写入内核,与内核相关的头文件
#include <linux/fs.h> 文件系统头文件
#include <linux/init.h> 初始化头文件
#include <linux/delay.h> 延时头文件
#include <asm/irq.h> 与处理器相关的中断
#include <linux/interrupt.h> 操作系统中断
#include <asm/uaccess.h> 与处理器相关的入口
//#include <asm/arch/regs-gpio.h> 与处理器相关的IO口操作
#include <mach/regs-gpio.h> 同上
//#include <asm/hardware.h> 与处理器相关的硬件
#include <mach/hardware.h> 同上
#include <linux/device.h> 设备驱动文件
#include <linux/poll.h> 轮询文件
#include <linux/gpio.h> 操作系统相关的IO口文件
#include <stdio.h> 标准输入输出
#include <stdlib.h> 标准库
#include <unistd.h>
#include <sys/ioctl.h> IO控制
以下6个是提供的函数中所需的头文件
具体我也不详
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <sys/select.h>
#include <sys/time.h>
#include <errno.h>
⑷ 如何在Linux系统中直接操作GPIO
在一个老手的指导下,应用层可以直接操作GPIO,具体指设置GPIO的输入输出以及输出电平高或者低。这个大大地提高了灵活性,官方的文档有GPIO Sysfs Interface for Userspace,GPIO Sysfs。
这里我记录一下使用过例子:
# RK30_PIN0_PD4
# A0-7 -> 0-7 / B0-7 -> 8-15 / C0-7 -> 16-23 / D0-7 -> 24-31
echo 28 > /sys/class/gpio/export
echo "out" > /sys/class/gpio/gpio28/direction
echo 1 > /sys/class/gpio/gpio28/value
以上代码作用是:将RK30_PIN0_PD4设置为输出,将输出电平设置为高电平。
⑸ linux中按键控制gpio灯的驱动程序怎么写。(自定义函数,gpio引脚)
这东西不是一两句话能说得好的,建议先了解linux驱动程序编写的框架,按照框架来,不用你自己来自定义函数,检测按键按下是,对对应的GPIO管脚操作就可以了
⑹ gpio编程如何将程序
嘿嘿,那是当然了,STM32是32位单片机,51是8位机,两者不是一个数量级的。
51单片机的I/O口就是I/O口,没那么多功能,
而STM32呢,它的GPIO口既可以做数字I/O,有些也可以做A/D,D/A,有些可以做SPI或者I2C对外通讯,还有些是做PWM脉宽输出,功能各有不同。这些功能都需要实现配置好才能让单片机知道你打算怎么用这些口。51简单死了,没有A/D,D/A,没有SPI通讯,也没有PWM,就是I/O,每个口也只有那么一个寄存器,直接读写就完了。
而到了32位机就不一样了,那么多功能,那么多寄存器,如果不用库的话,就要一位一位地把每个寄存器都设好,非常麻烦。ST专门给STM32编制了一个函数库,所有的函数库设置你只需要调用函数库的函数就好。如果你英语还说得过去的话,看着函数库就可以基本不用去每一位对寄存器了,牺牲了效率,但是非常非常的方便。
至于使用起来,也非常简单,比如你要用GPIO,你就把STM32F10X_GPIO.C加到你的工程文件中去,然后在你在程序里引用一下#include "stm32f10x.h",就可以了。当然,我觉得这么做还要一个一个文件地想,到底需要不需要,干脆把所有的C文件都加到工程里去,然后在编译器里打开Level-2优化,这样没有用到的函数都不会被编译到最终的hex文件中去了。想用到什么函数都可以,非常方便的。
⑺ linux可以在用户空间下控制gpio是怎样实现的
简单理解为:内核空间是内核使用,用户空间是应用程序使用;除非编译内核要考虑内核空间,其余情况都可以按照用户空间处理
⑻ linux下通过GPIO仿时钟,引脚只拉高拉低一次,后续置位、复位操作貌似没有执行
CPU执行指令的速度和写GPIO的速度相差太大, 你就算模拟时钟,也应该在每个写IO的指令之间加个延时吧?
⑼ 在linux内核的arm开发板上写驱动需要做什么
先保证会写x86的linux驱动(即掌握驱动编程)
了解arm开发板的CPU管脚连接(了解GPIO接法)
把x86的linux驱动中,对应的管脚改成arm的管脚就可以了。
使用嵌入式gcc进行编译
会把编译产物烧写到arm板中
会给arm板加电启动