文档章节

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

redstone5
 redstone5
发布于 2017/05/08 14:36
字数 762
阅读 37
收藏 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
粉丝 3
博文 53
码字总数 38257
作品 0
玉溪
私信 提问
[初学嵌入式]完全没有接触过linux也可以轻松玩转4412开发板

需要按照以下方法和步骤来学习,轻松玩转开发板。 以下学习内容均有配套视频。 1.开发板上电测试以及提供的基本资料介绍:所 学手册的章节包括(第一章节) 2.安装超级终端,理解uboot模式和...

topeet
2015/08/03
657
0
做了8年的国产开源硬件

OK335xD开发板采用了TI公司的AM335X Cortex-A8处理器,运行主频最高可达1GHz,集成了1路千兆网口、CAN总线控制器、IIC控制器、LCD控制器、Power VR SGX530图形处理器,非常适合工业控制、多媒...

654945567
2013/12/19
14
0
简单分析下Android 内核

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

sprinl
2011/07/03
0
0
S5P4418开发板/真正A9四核开发板全球独家发布

REAL4418高端开发系统平台 推荐理由: 1、三星中国S5P4418开发系统国内唯一旗舰商; 2、全球绝对独家发布,独家支持3G/4G电话和短信功能;支持休眠唤醒; 3、真正的A9四核高端开发板; 4、严格...

REALARM123456
2015/05/15
1
0
我该往哪个方向走?

个人信息:机电专业毕业;因为兴趣专业课数模电、单片机、c、学的比较好!后来为了踏入嵌入式行业去培训了4个月嵌入式:C/C++、Linux 、Driver、ARM9、QT; 12年踏入嵌入式行业!做了一年的系...

朱一心
2013/03/30
882
10

没有更多内容

加载失败,请刷新页面

加载更多

关于ComponentOne For WinForm 的全新控件 – DataFilter数据切片器(Beta)

概述 数据切片器在电子商务网站上很常见 - 它们可以帮助用户快速过滤所选商品,并且所有过滤选项都可以在一个地方使用,通常包含核心控件类型为:清单,范围栏和单选按钮等。在ComponentOne ...

葡萄城技术团队
3分钟前
0
0
Spring Data JPA 常见异常

异常一: Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'userRepository': Invocation of init method failed; nested exception i......

小99
4分钟前
0
0
聊聊flink的EventTime

序 本文主要研究一下flink的EventTime SourceFunction flink-streaming-java_2.11-1.7.0-sources.jar!/org/apache/flink/streaming/api/functions/source/SourceFunction.java /** * Inte......

go4it
16分钟前
1
0
如何解决 homebrew 更新慢的问题

之前一直困扰于 Homebrew 的更新速度,曾试过修改更新源(清华、中科大等)的方式,但是并没什么卵用;也试过设置 curl 代理的方式,但是 brew 走的好像不是 curl 的方式,所以也没用。 通过...

whoru
21分钟前
2
0
TiDB EcoSystem Tools 原理解读系列(二)TiDB-Lightning Toolset 介绍

简介 TiDB-Lightning Toolset 是一套快速全量导入 SQL dump 文件到 TiDB 集群的工具集,自 2.1.0 版本起随 TiDB 发布,速度可达到传统执行 SQL 导入方式的至少 3 倍、大约每小时 100 GB,适合...

TiDB
23分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部