linux简单的gpio驱动实例

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

今天完成了嵌入式linux的第一个驱动的编写和测试,虽然是个简单的程序,但是麻雀虽小,五脏俱全,希望可以给刚开始接触驱动编写的人一些提示,共同进步。

源代码:

分析如下:

下面是我的驱动程序:

#include //配置头文件

#include /*内核头文件,作为系统核心的一部分,设备驱动程序在申请和释放内存时,不是调用malloc和free,而是调用kmalloc和

kfree*/

#include //调度,进程睡眠,唤醒,中断申请,中断释放

#include //时钟头文件

#include //用户定义模块初始函数名需引用的头文件

#include //模块加载的头文件

#include

#include //这个是2440的寄存器头文件,asm/srch只是个链接

//实际根据自己的情况查找,一般

是../../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)

相关文档
最新文档