linux简单的gpio驱动实例
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
今天完成了嵌入式linux的第一个驱动的编写和测试,虽然是个简单的程序,但是麻雀虽小,五脏俱全,希望可以给刚开始接触驱动编写的人一些提示,共同进步。
源代码:
分析如下:
下面是我的驱动程序:
#include
#include
kfree*/
#include
#include
#include
#include
#include
#include
//实际根据自己的情况查找,一般
是../../linux2.*.*/include/asm/arch-s3c2440里编译器
//自己会查询链接,以前不知道,找了半天
// GPIO_LED DEVICE MAJOR
#define GPIO_LED_MAJOR 97 //定义主设备号
//define LED STATUS 我的板子 LED在GPB0 与GPB1 处大家根据自己情况改
#define LED_ON 0 //定义LED灯的状态开
#define LED_OFF 1 //
// ------------------- READ ------------------------ 这个前面要加static 否则警告
static ssize_t GPIO_LED_read (struct file * file ,char * buf, size_t count, loff_t * f_ops)
{
return count;
}
// ------------------- WRITE -----------------------
static ssize_t GPIO_LED_write (struct file * file ,const char * buf, size_t count, loff_t * f_ops)
{
return count;
}
// ------------------- IOCTL -----------------------
static ssize_t GPIO_LED_ioctl (struct inode * inode ,struct file * file, unsigned int cmd, long data) //这个函数实现了led灯亮灭的接口{
switch (cmd)
{
case LED_ON : { GPBDAT =0x01; break;} //根据自己情况修改一个亮一个灭
case LED_OFF: { GPBDAT =0x02; break;} //交替闪烁
default :
{printk ("lcd control : no cmd run [ --kernel-- ]\n"); return (-EINVAL);} }
return 0;
}
// ------------------- OPEN ------------------------
static ssize_t GPIO_LED_open (struct inode * inode ,struct file * file) {
MOD_INC_USE_COUNT;
return 0;
}
// ------------------- RELEASE/CLOSE ---------------
static ssize_t GPIO_LED_release (struct inode * inode ,struct file * file)
{
MOD_DEC_USE_COUNT;
return 0;
}
// -------------------------------------------------
struct file_operations GPIO_LED_ctl_ops ={
open: GPIO_LED_open, //这段赋值代码必须放在接口函数申明之后
read: GPIO_LED_read, //否则编译不过去
write: GPIO_LED_write,
ioctl: GPIO_LED_ioctl,
release: GPIO_LED_release,
};
// ------------------- INIT ------------------------
static int GPIO_LED_CTL_init(void)
{
int ret = -ENODEV;
printk("--------------------------------------------\n\n");
GPBCON = 0x0005; // 设置端口为I/O输出模式
GPBUP = 0xff; // 关闭上拉功能
GPBDAT = 0xf; //初始值为高电平熄灭LED灯
ret = register_chrdev(GPIO_LED_MAJOR, "gpio_led_ctl",
&GPIO_LED_ctl_ops);
//这个驱动注册函数必须放在复制接口的那个结构体之后
if( ret < 0 )
{
printk (" S3C2410: init_module failed with %d\n", ret);
return ret;
}
else
{
printk("S3C2410 gpio_led_driver register success!!! \n");
}
return ret;
}
static int __init S3C2410_GPIO_LED_CTL_init(void)