上一节我们介绍 了andriod软件层怎么调用C程序,以及C库的编译与加载,实现了应用层和底层连系的关键部分,接下来,把内核驱动部分编写完成,该章节就结束了,假定你已经看过之前的博文。
LED驱动加载相信大家看到这里已经有了一定linux驱动的基础,简单驱动不做介绍,可另行查阅其他资料,创建C文件leds_drv.c,代码如下:
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
static const int led1_gpio = (32*0 + 8*1 + 4);
static const int led2_gpio = (32*0 + 8*1 + 0);
static int gec3399_leds_open(struct inode *inode, struct file *file)
{
return 0;
}
static long gec3399_leds_ioctl(struct file *filp, unsigned int cmd, unsigned long arg)
{
//printk("cmd = %u arg = %lu\n",cmd,arg);
switch(cmd)
{
case 0: switch(arg)
{
case 0: gpio_set_value(led1_gpio,0); break;
case 1: gpio_set_value(led1_gpio,1); break;
}break;
case 1: switch(arg)
{
case 0: gpio_set_value(led2_gpio,0); break;
case 1: gpio_set_value(led2_gpio,1); break;
}break;
}
return 0;
}
static int gec3399_leds_release(struct inode *inode, struct file *file)
{
return 0;
}
static const struct file_operations gec3399_leds_fops = {
.owner = THIS_MODULE,
.open = gec3399_leds_open,
.unlocked_ioctl = gec3399_leds_ioctl,
.release = gec3399_leds_release,
};
static struct miscdevice gec3399_leds_misc = {
.minor = MISC_DYNAMIC_MINOR,
.fops = &gec3399_leds_fops,
.name = "leds_drv",
};
static int __init gec3399_leds_init(void)
{
int ret;
ret = misc_register(&gec3399_leds_misc); //注册字符设备
if(ret
关注
打赏
最近更新
- 深拷贝和浅拷贝的区别(重点)
- 【Vue】走进Vue框架世界
- 【云服务器】项目部署—搭建网站—vue电商后台管理系统
- 【React介绍】 一文带你深入React
- 【React】React组件实例的三大属性之state,props,refs(你学废了吗)
- 【脚手架VueCLI】从零开始,创建一个VUE项目
- 【React】深入理解React组件生命周期----图文详解(含代码)
- 【React】DOM的Diffing算法是什么?以及DOM中key的作用----经典面试题
- 【React】1_使用React脚手架创建项目步骤--------详解(含项目结构说明)
- 【React】2_如何使用react脚手架写一个简单的页面?