android驱动学习-sysfs文件系统设备--LED(3)

目的:学习sysfs文件系统,直接在应用层使用cat 和echo命令来控制LED。

 

===============================================

驱动:

C代码   收藏代码
  1. #include <linux/module.h>  
  2. #include <asm/uaccess.h>  
  3. #include <linux/version.h>  
  4. #include <linux/io.h>  
  5. #include <linux/gpio.h>  
  6. #include <plat/gpio-cfg.h>  
  7. #include <mach/regs-gpio.h>  
  8. #include <asm/mach/arch.h>  
  9. #include <linux/kobject.h>  
  10. #include <linux/string.h>  
  11.   
  12. #define GPIO_LED1  S5PV210_GPH1(3)  
  13. struct kobject *kobj;  
  14. const static char *str_ledon = "ledon";  
  15. const static char *str_ledoff= "ledoff";  
  16.   
  17. static ssize_t led_show(struct kobject *kobj, struct kobj_attribute *attr,char *buf )  
  18. {  
  19.     char *s= buf;  
  20.     int len;  
  21.     if(gpio_get_value(GPIO_LED1))  
  22.        s += sprintf(s,"%s\n",str_ledon);  
  23.     else  
  24.       s += sprintf(s,"%s\n",str_ledoff);  
  25.     if (s != buf)  
  26.         *(s-1) = '\n';  
  27.   
  28.     return (s - buf);  
  29. }  
  30. static ssize_t led_store(struct kobject *kobj,struct kobj_attribute *attr,const char* buf, size_t n)  
  31. {  
  32.      
  33.     char *p;  
  34.     int len;  
  35.     p = memchr(buf, '\n', n);  
  36.     len = p ? p - buf : n;   
  37.     printk(KERN_INFO "%s:enter\n",__func__);  
  38.       
  39.     s3c_gpio_cfgpin(GPIO_LED1,S3C_GPIO_OUTPUT  );  
  40.     s3c_gpio_setpull(GPIO_LED1,S3C_GPIO_PULL_UP );  
  41.     if(gpio_request(GPIO_LED1,"led_sysfs")> 0)  
  42.     {  
  43.         if(!strncmp(buf,str_ledon,len ))  
  44.         {  
  45.             printk(KERN_INFO "%s:1\n",__func__);  
  46.             gpio_set_value(GPIO_LED1,0);  
  47.         }  
  48.         else if(!strncmp(buf,str_ledoff,len ))  
  49.         {  
  50.             printk(KERN_INFO "%s:2\n",__func__);  
  51.             gpio_set_value(GPIO_LED1,1);  
  52.         }  
  53.     }  
  54.     else  
  55.        printk(KERN_INFO "%s:3\n",__func__);   
  56.   
  57.     return len ;  
  58. }  
  59. //具体属性参数  
  60. static struct kobj_attribute  kobj_attr ={  
  61.     .attr = {  
  62.         .name =  __stringify(ledstate), //把ledstate转换成字符串  
  63.         .mode = 0666, //表示此属性可读可写  
  64.      },  
  65.     .show = led_show, //对应读  
  66.     .store= led_store, //对应写  
  67.   
  68. };  
  69. //属性数组  
  70. static struct attribute *attr_g[] ={  
  71.     &kobj_attr.attr,  
  72.     NULL,// 必须包含NULL  
  73. };  
  74. //对属性数组的封装。  
  75. static struct attribute_group grp ={  
  76.     .attrs = attr_g,  
  77. };  
  78.       
  79. static int __init led_init(void)  
  80. {  
  81.   
  82.       
  83.     kobj = kobject_create_and_add("led_sysfs",NULL);  
  84.     if(!kobj )  
  85.     {  
  86.         printk(KERN_INFO "kobject don't create \n");  
  87.         return -ENOMEM;  
  88.     }  
  89.    return  sysfs_create_group(kobj, &grp);  
  90.   
  91. }  
  92. static void __exit led_exit(void)  
  93. {  
  94.    printk(KERN_INFO "%s:enter\n",__func__);  
  95.    sysfs_remove_group(kobj, &grp);  
  96.    kobject_del(kobj);  
  97. }  
  98.   
  99.   
  100. module_init(led_init);  
  101. module_exit(led_exit);  
  102. MODULE_LICENSE("GPL");  

 

Makefile:

 

C代码   收藏代码
  1. OBJ = /home/xhy/kernel  
  2.   
  3. all :  
  4.     make -C $(OBJ) M=`pwd` modules  
  5. clean:  
  6.     make -C $(OBJ) M=`pwd` clean  
  7.   
  8. obj-m   += led_sysfs.o  

 --------------------------------------------------

  make后把生成的led_sysfs.ko文件push到小机上,

  adb shell

  insmod led_sysfs.ko

  cd /sys/

C代码   收藏代码
  1. # lsmod  
  2. led_sysfs 1432 0 - Live 0xbf02a000  

 

  cd led_sysfs

 

C代码   收藏代码
  1. # cat ledstate  
  2. ledoff  

 

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值