目的:学习sysfs文件系统,直接在应用层使用cat 和echo命令来控制LED。
===============================================
驱动:
#include <linux/module.h>
#include <asm/uaccess.h>
#include <linux/version.h>
#include <linux/io.h>
#include <linux/gpio.h>
#include <plat/gpio-cfg.h>
#include <mach/regs-gpio.h>
#include <asm/mach/arch.h>
#include <linux/kobject.h>
#include <linux/string.h>
#define GPIO_LED1 S5PV210_GPH1(3)
struct kobject *kobj;
const static char *str_ledon = "ledon";
const static char *str_ledoff= "ledoff";
static ssize_t led_show(struct kobject *kobj, struct kobj_attribute *attr,char *buf )
{
char *s= buf;
int len;
if(gpio_get_value(GPIO_LED1))
s += sprintf(s,"%s\n",str_ledon);
else
s += sprintf(s,"%s\n",str_ledoff);
if (s != buf)
*(s-1) = '\n';
return (s - buf);
}
static ssize_t led_store(struct kobject *kobj,struct kobj_attribute *attr,const char* buf, size_t n)
{
char *p;
int len;
p = memchr(buf, '\n', n);
len = p ? p - buf : n;
printk(KERN_INFO "%s:enter\n",__func__);
s3c_gpio_cfgpin(GPIO_LED1,S3C_GPIO_OUTPUT );
s3c_gpio_setpull(GPIO_LED1,S3C_GPIO_PULL_UP );
if(gpio_request(GPIO_LED1,"led_sysfs")> 0)
{
if(!strncmp(buf,str_ledon,len ))
{
printk(KERN_INFO "%s:1\n",__func__);
gpio_set_value(GPIO_LED1,0);
}
else if(!strncmp(buf,str_ledoff,len ))
{
printk(KERN_INFO "%s:2\n",__func__);
gpio_set_value(GPIO_LED1,1);
}
}
else
printk(KERN_INFO "%s:3\n",__func__);
return len ;
}
//具体属性参数
static struct kobj_attribute kobj_attr ={
.attr = {
.name = __stringify(ledstate), //把ledstate转换成字符串
.mode = 0666, //表示此属性可读可写
},
.show = led_show, //对应读
.store= led_store, //对应写
};
//属性数组
static struct attribute *attr_g[] ={
&kobj_attr.attr,
NULL,// 必须包含NULL
};
//对属性数组的封装。
static struct attribute_group grp ={
.attrs = attr_g,
};
static int __init led_init(void)
{
kobj = kobject_create_and_add("led_sysfs",NULL);
if(!kobj )
{
printk(KERN_INFO "kobject don't create \n");
return -ENOMEM;
}
return sysfs_create_group(kobj, &grp);
}
static void __exit led_exit(void)
{
printk(KERN_INFO "%s:enter\n",__func__);
sysfs_remove_group(kobj, &grp);
kobject_del(kobj);
}
module_init(led_init);
module_exit(led_exit);
MODULE_LICENSE("GPL");
Makefile:
OBJ = /home/xhy/kernel
all :
make -C $(OBJ) M=`pwd` modules
clean:
make -C $(OBJ) M=`pwd` clean
obj-m += led_sysfs.o
--------------------------------------------------
make后把生成的led_sysfs.ko文件push到小机上,
adb shell
insmod led_sysfs.ko
cd /sys/
# lsmod
led_sysfs 1432 0 - Live 0xbf02a000
cd led_sysfs
# cat ledstate
ledoff
分享到:
相关推荐
sysfs文件系统
文章主要介绍了一些设备驱动相关的sys文件系统,结合ldd3(linux device driver 3)中的示例代码(主要是lddbus 和sculld 文件夹),详细分析虚拟文件系统sysfs,以及如何编写基于sysfs的模块化的驱动程序。使用的内核是...
sysfs 文件系统详解,IBM官方网站学习,
sysfs方式实现马达驱动 - .mht sysfs方式实现马达驱动 - .mht
This module exports the DMI tables read-only to userspace through the sysfs file system.
这个例了同时也展示了sysfs文件系统在驱动程序中的用法,以及通过Linux设各模型来创建设备节点及其他一些特性(这个看起来很简单的内核模块其实体现了设备驱动程序中一些比较重要且典型的特征)。 首先是设备驱动程序...
sysfs文件系统参照.pdf
IOMMU sysfs class support for Linux v2.13.6.
RTC subsystem, sysfs interface for Linux v2.13.6.
5.1.2设备驱动与Linux文件系统的关联 5.2 Linux设备文件系统 5.2.1 devfs设备文件系统 5.2.2 udev设备文件系统 5.2.3 sysfs文件系统与Linux设备 5.2.4 udev的组成 5.2.5 udev规则文件 第6章Linux字符设备驱动 6.1 ...
This module exports the DMI tables read-only to userspace through the sysfs file system.
官方离线安装包,亲测可用
官方离线安装包,亲测可用
离线安装包,亲测可用
sysfs子系统: 1.qsysfs是什么 2.使用sysfs 3.创建目录 4.属性(Attributes) 5.子系统特定的回调(Subsystem-Specific Callbacks) 6.读/写属性数据 7.顶级目录布局(Top Level Directory Layout) 8.当前的接口(Current ...
Patrick Mochel的这篇文档介绍了sysfs文件系统的结构及编程接口,可作为linux驱动开发的参考
show overlays rotate for Linux v2.13.6.
Some code and ideas taken drivers video omap driver.
spin until power button pressed for Linux v2.13.6.
Since the VRAM for this FB is not allocated at the moment we don t need to do any further parameter checking at this point.