文档章节

x6818开发板安卓驱动开发(1)-LED-driver

redstone5
 redstone5
发布于 2017/05/08 14:36
字数 762
阅读 29
收藏 0

通过sysfs,即kobject实现LED灯的控制。
x6818_led_drv.c:

#include <linux/module.h>
#include <linux/init.h>
#include <linux/platform_device.h>
#include <asm/mach-types.h>
#include <linux/gpio.h>
#include <mach/platform.h>
#include <mach/soc.h>

#define X6818_LEDS_MODULE_NAME	"x6818-leds"

/*
* X6818 LED:
* LED1 -> D22 -> GPIO_B26
* LED2 -> D23 -> GPIOC11
* LED3 -> D24 -> GPIOC7
* LED4 -> D25 -> GPIOC12
* 4个LED为供阳极LED,相关的GPIO电压拉低灯亮,拉高灯灭
*/
#define X6818_LEDS_NUMBER	4
#define X6818_LED1_GPIO		(PAD_GPIO_B + 26)
#define X6818_LED2_GPIO		(PAD_GPIO_C + 11)
#define X6818_LED3_GPIO		(PAD_GPIO_C + 7)
#define X6818_LED4_GPIO		(PAD_GPIO_C + 12)

#define X6818_LED_ON		0
#define X6818_LED_OFF		1

typedef struct __led{
	char * name;
	unsigned gpio;
	int status;
}led;
static led x6818_leds[X6818_LEDS_NUMBER] ={
	{ .name = "led1", .gpio = X6818_LED1_GPIO, .status = 0},
	{ .name = "led2", .gpio = X6818_LED2_GPIO, .status = 0},
	{ .name = "led3", .gpio = X6818_LED3_GPIO, .status = 0},
	{ .name = "led4", .gpio = X6818_LED4_GPIO, .status = 0},
}; 


static void __x6818_leds_probe(void)       //初始化LED对应GPIO口
{
	int ret = 0;
	int i;
	for(i = 0; i < X6818_LEDS_NUMBER; i++){
		nxp_soc_gpio_set_io_func(x6818_leds[i].gpio, NX_GPIO_PADFUNC_1); //gpio mode
		nxp_soc_gpio_set_io_dir(x6818_leds[i].gpio, 1);		 //output mode
		nxp_soc_gpio_set_io_pull_sel(x6818_leds[i].gpio, 1); // pull up select
		nxp_soc_gpio_set_io_pull_enb(x6818_leds[i].gpio, 1); // pull up  enable
		nxp_soc_gpio_set_out_value(x6818_leds[i].gpio,X6818_LED_OFF); //默认led关
		x6818_leds[i].status = 0;
	}

}
static void __x6818_leds_remove(void)    
{

}
static ssize_t x6818_leds_read(struct device *dev, struct device_attribute *attr, char *buf)
{
	int i;
	for(i = 0; i < X6818_LEDS_NUMBER; i++){
		if(!strcmp(attr->attr.name, x6818_leds[i].name)){
			if(x6818_leds[i].status)
				return strlcpy(buf, "1\n", 3);
			else
				return strlcpy(buf, "0\n", 3);
					
		}

	}
	return strlcpy(buf, "\n", 3);
}
static ssize_t x6818_leds_write(struct device *dev, struct device_attribute *attr, const char *buf, size_t count)
{
	int i;
	unsigned long on = simple_strtoul(buf, NULL, 10);//convert a string to an unsigned long 从应用读取需要写入的数据 10进制
	for(i = 0; i < X6818_LEDS_NUMBER; i++){
		if(!strcmp(attr->attr.name, x6818_leds[i].name)){
			if(on){
				nxp_soc_gpio_set_out_value(x6818_leds[i].gpio,X6818_LED_ON); //默认led关
				x6818_leds[i].status = 1;
			}
			else{
				nxp_soc_gpio_set_out_value(x6818_leds[i].gpio,X6818_LED_OFF); //默认led关
				x6818_leds[i].status = 0;
			}
			break;
		}
	}	
	return count;
}



//kobject目录下的四个文件对应的属性,读写函数
static DEVICE_ATTR(led1, 0666, x6818_leds_read, x6818_leds_write);
static DEVICE_ATTR(led2, 0666, x6818_leds_read, x6818_leds_write);
static DEVICE_ATTR(led3, 0666, x6818_leds_read, x6818_leds_write);
static DEVICE_ATTR(led4, 0666, x6818_leds_read, x6818_leds_write);
static struct attribute * x6818_leds_sysfs_entries[] = {		  //对应kobject目录下的四个文件
		 &dev_attr_led1.attr,
		 &dev_attr_led2.attr,
		 &dev_attr_led3.attr,
		 &dev_attr_led4.attr,
		 NULL,
};

static struct attribute_group x6818_leds_attr_group = {
         .name   = NULL,
         .attrs  = x6818_leds_sysfs_entries,   //指定注册的kobject对应的文件属性接入点
};
static int x6818_leds_probe(struct platform_device *pdev)
{
         __x6818_leds_probe();                                       //初始化LED对应GPIO口
         return sysfs_create_group(&pdev->dev.kobj, &x6818_leds_attr_group);//注册kobject
}
static int x6818_leds_remove(struct platform_device *pdev)
{
         __x6818_leds_remove();                                     //释放GPIO
         sysfs_remove_group(&pdev->dev.kobj, &x6818_leds_attr_group);//注销kobject
         return 0;
}


static struct platform_driver x6818_leds_driver = {
	.probe		= x6818_leds_probe,
	.remove 	= x6818_leds_remove,
	.driver 	= {
		.name	= X6818_LEDS_MODULE_NAME,
	},
};
		
static struct platform_device x6818_leds_device = {
	.name      = X6818_LEDS_MODULE_NAME,
	.id        = -1,
};		
	
static int __devinit x6818_leds_init(void)
{
	int ret;

	printk("x6818 leds driver\r\n");

	ret = platform_device_register(&x6818_leds_device);
	if(ret)
		printk("failed to register x6818 leds device\n");

	ret = platform_driver_register(&x6818_leds_driver);
	if(ret)
		printk("failed to register x6818 leds driver\n");

	return ret;
}

static void x6818_leds_exit(void)
{
	platform_device_unregister(&x6818_leds_device);
	platform_driver_unregister(&x6818_leds_driver);
}

module_init(x6818_leds_init);
module_exit(x6818_leds_exit);

MODULE_LICENSE("GPL");
MODULE_DESCRIPTION("x6818 leds driver");

Makefile:

KERN_DIR = /home/wzs/Android/x6818/kernel/
all:
	make -C $(KERN_DIR) M=`pwd` modules 

clean:
	make -C $(KERN_DIR) M=`pwd` modules clean
	rm -rf modules.order

obj-m	+= x6818_led_drv.o

通过adb上传驱动文件到安卓文件系统:

adb push ./x6818_led_drv.ko /data/local/tmp

内核加载驱动:

insmod x6818_led_drv.ko

相关目录下将自动产生设备节点:

测试:

开启led1:

echo 1 > /sys/devices/platform/x6818-leds/led1

关闭led1:

echo 0 > /sys/devices/platform/x6818-leds/led1

读取led1当前状态:

cat /sys/devices/platform/x6818-leds/led1

其余led类似。

© 著作权归作者所有

共有 人打赏支持
redstone5
粉丝 2
博文 49
码字总数 37304
作品 0
玉溪
简单分析下Android 内核

通过和标准的Linux 2.6.25 Kernel的对比,我们可以发现,其主要增加了以下的内容: 1.增加了yaffs2 FLASH文件系统,相应增加的目录为: kernel/fs/yaffs2 实际上,Android包经过编译后生成的syste...

sprinl
2011/07/03
0
0
android之wifi移植全过程(二)

六、android的wifi移植。 现在底层的都通了,接下来就把wifi移植到android系统中。 1.提供固件firmware给驱动。 WIFI需要的firmware要复制到/etc/firmware。 或者复制到WIFI驱动指定的位置,...

sflfqx
2013/09/06
0
0
android之wifi移植全过程(一)

硬件环境 WIFI模块:Marvell8686 SDIO WIFI 开发板:S5PC100 软件环境 Linux 2.6.29 Android 2.1 项目目标:实现WIFI上网功能、并对WIFI休眠进行改善。 项目开发流程: 硬件分析:对Marvell...

sflfqx
2013/09/06
0
0
Android实践:做一个可视频交互的智能小车

本文的三位作者正阳、海洋、阿力,是来自不同公司的工程师,在Agora RTC Hack 上海站编程马拉松上,开发了一款可实时视频远程看房的智能小车。本文将从方案设计、硬件开发、Android 端开发、...

Agora
08/01
0
0
android-- A10开发板--Tslib 移植心得体会

tslib,其实从他的名字就可以看出它的,它是touchscreen的lib,其实这样还不够具体,其实它开始确实是为了touchscreen的鼠标驱动而发展起来的,且只是一个中间处理库,即将原始数据进行调整,...

雨焰
2012/09/27
0
2

没有更多内容

加载失败,请刷新页面

加载更多

下一页

kernel version does not match DSO version

错误信息: kernel version 384.11 does not match DSO version 384.130.0 原因是: cuda driver版本太低,不匹配DSO 简单有效的修复方法,升级nvidia driver, 步骤如下: 1. google seach ...

刘小米
今天
0
0
maven坐标和依赖

一、maven坐标详解 <groupId>com.fgt.club</groupId><artifactId>club-common-service-facade</artifactId><version>3.0.0</version><packaging>jar</packaging> maven的坐标元素说......

老韭菜
今天
1
0
springmvc-servlet.xml配置表功能解释

问:<?xml version="1.0" encoding="UTF-8" ?> 答: xml version="1.0"表示是此xml文件的版本是1.0 encoding="UTF-8"表示此文件的编码方式是UTF-8 问:<!DOCTYPE beans PUBLIC "-//SPRING//......

隐士族隐逸
今天
1
0
基于TP5的微信的公众号获取登录用户信息

之前讲过微信的公众号自动登录的菜单配置,这次记录一下在TP5项目中获取自动登录的用户信息并存到数据库的操作 基本的流程为:微信设置自动登录的菜单—>访问的URL指定的函数里获取用户信息—...

月夜中徘徊
今天
0
0
youTrack

package jetbrains.teamsys.license.runtime; 计算lis package jetbrains.ring.license.reader; 验证lis 安装后先不要生成lis,要把相关文件进行替换 ring-license-checker-1.0.41.jar char......

max佩恩
今天
2
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部