Firefly开源社区

标题: fireprime-rk3128 android app 通过jni控制GPIO的代码 [打印本页]

作者: carlinluo    时间: 2015-8-25 17:23
标题: fireprime-rk3128 android app 通过jni控制GPIO的代码
本帖最后由 carlinluo 于 2015-8-25 17:27 编辑

驱动
  1. #include <dt-bindings/gpio/gpio.h>
  2. #include <linux/gpio.h>
  3. #include <linux/of_gpio.h>
  4. #include <linux/module.h>
  5. #include <linux/kernel.h>
  6. #include <linux/init.h>
  7. #include <linux/platform_device.h>
  8. #include <linux/fb.h>
  9. #include <linux/backlight.h>
  10. #include <linux/err.h>
  11. #include <linux/pwm.h>
  12. #include <linux/pwm_backlight.h>
  13. #include <linux/slab.h>
  14. #include <linux/device.h>
  15. #include <linux/miscdevice.h>
  16. #include <asm/uaccess.h>





  17. static struct UserData{
  18.                 int gpio;
  19.                 int state;
  20. };


  21. static struct of_device_id luobogpio_of_match[] = {
  22.         { .compatible = "luobogpio" },
  23.         { }
  24. };

  25. MODULE_DEVICE_TABLE(of, luobogpio_of_match);


  26. static int luobogpio_open(struct inode *inode, struct file *filp)
  27. {
  28.     printk("luobogpio_open\n");

  29.         return 0;
  30. }

  31. static ssize_t luobogpio_read(struct file *filp, char __user *ptr, size_t size, loff_t *pos)
  32. {
  33.         if (ptr == NULL)
  34.                 printk("%s: user space address is NULL\n", __func__);
  35.         return sizeof(int);
  36. }

  37. static long luobogpio_ioctl(struct file *filp, unsigned int cmd, unsigned long arg)
  38. {
  39.         long ret = 0;        
  40.         struct UserData userdata;
  41.         unsigned char label[10];


  42.         printk("luobogpio_ioctl: cmd = %d arg = %ld\n",cmd, arg);

  43.         switch (cmd){

  44.         case 0:
  45.                                 printk("gpio_request\n");
  46.                                 
  47.                                 if (copy_from_user((void*)&userdata,(void __user *)arg, sizeof(struct UserData)))
  48.                 return -EFAULT;
  49.                 printk("copy_from_user  gpio=%d ,state=%d\n",userdata.gpio,userdata.state);
  50.                


  51.                 sprintf(label,"gpio-%d",userdata.gpio);
  52.                 printk("----->%s\n",label);
  53.                                 ret = gpio_request(userdata.gpio, label);
  54.                                 if (ret) {
  55.                                            printk("failed to request GPIO%d for you ret:%d\n",userdata.gpio,ret);
  56.                                  }
  57.                           break;
  58.          case 1:
  59.                   
  60.                             printk("gpio_direction_output\n");
  61.                           
  62.                             if (copy_from_user((void*)&userdata,(void __user *)arg, sizeof(struct UserData)))
  63.                 return -EFAULT;
  64.                 printk("copy_from_user  gpio=%d ,state=%d\n",userdata.gpio,userdata.state);
  65.                             ret=gpio_direction_output(userdata.gpio, userdata.state);
  66.                                   if (ret) {
  67.                                 printk("failed to gpio_direction_output  for you ret:%d\n",userdata.gpio);
  68.                                  }
  69.           break;
  70.                         
  71.           case 5:
  72.                                 printk("gpio_free\n");
  73.                                   if (copy_from_user((void*)&userdata,(void __user *)arg, sizeof(struct UserData)))
  74.                 return -EFAULT;
  75.                 printk("copy_from_user  gpio=%d ,state=%d\n",userdata.gpio,userdata.state);
  76.                                 gpio_free(userdata.gpio);

  77.           break;
  78.                
  79.                 default:
  80.                         printk("unknown ioctl cmd!\n");
  81.                         ret = -EINVAL;
  82.                         break;
  83.         }
  84.         return ret;
  85. }

  86. static int luobogpio_release(struct inode *inode, struct file *filp)
  87. {
  88.     printk("luobogpio_release\n");
  89.    
  90.         return 0;
  91. }

  92. static struct file_operations luobogpio_fops = {
  93.         .owner   = THIS_MODULE,
  94.         .open    = luobogpio_open,
  95.         .read    = luobogpio_read,
  96.         .unlocked_ioctl   = luobogpio_ioctl,
  97.         .release = luobogpio_release,
  98. };

  99. static struct miscdevice luobogpio_dev =
  100. {
  101.     .minor = MISC_DYNAMIC_MINOR,
  102.     .name = "luobogpio",
  103.     .fops = &luobogpio_fops,
  104. };


  105. static int luobogpio_probe(struct platform_device *pdev)
  106. {
  107.     int ret=-1;
  108.         ret = misc_register(&luobogpio_dev);
  109.         if (ret < 0){
  110.                 printk("ac_usb_switch register err!\n");
  111.                 return ret;
  112.         }

  113.         printk("func: %s\n", __func__);
  114.         return 0;
  115. }

  116. static int luobogpio_remove(struct platform_device *pdev)
  117. {
  118.         //printk("func: %s\n", __func__);
  119.         return 0;
  120. }

  121. #ifdef CONFIG_PM_SLEEP
  122. static int luobogpio_suspend(struct device *dev)
  123. {
  124.         //printk("func: %s\n", __func__);
  125.         return 0;
  126. }

  127. static int luobogpio_resume(struct device *dev)
  128. {
  129.         //printk("func: %s\n", __func__);
  130.         return 0;
  131. }
  132. #endif

  133. static const struct dev_pm_ops luobogpio_pm_ops = {
  134. #ifdef CONFIG_PM_SLEEP
  135.         .suspend = luobogpio_suspend,
  136.         .resume = luobogpio_resume,
  137.         .poweroff = luobogpio_suspend,
  138.         .restore = luobogpio_resume,
  139. #endif
  140. };

  141. static struct platform_driver luogpio_driver = {
  142.         .driver                = {
  143.                 .name                = "luobogpio",
  144.                 .owner                = THIS_MODULE,
  145.                 .pm                = &luobogpio_pm_ops,
  146.                 .of_match_table        = of_match_ptr(luobogpio_of_match),
  147.         },
  148.         .probe                = luobogpio_probe,
  149.         .remove                = luobogpio_remove,
  150. };

  151. module_platform_driver(luogpio_driver);

  152. MODULE_DESCRIPTION("luobogpio Driver");
  153. MODULE_LICENSE("GPL");
  154. MODULE_ALIAS("platform:luobogpio");
复制代码


JNI

  1. static jint getGpio(JNIEnv *env, jobject thiz,jint num){

  2.     jint ret=-1;
  3.     UserData userdata;
  4.     memset(&userdata,0x00, sizeof(UserData));
  5.     //strlcpy(userdata.name, "gpio",10);
  6.     userdata.gpio=num;
  7.     userdata.state=0;

  8.     ret = ioctl(fd, CMD_GET_GPIO, &userdata);
  9.     return ret;
  10. }

  11. static jint releaseGpio(JNIEnv *env, jobject thiz,jint num){

  12.     jint ret=-1;
  13.     UserData userdata;
  14.     memset(&userdata,0x00, sizeof(UserData));
  15.     userdata.gpio=num;
  16.     userdata.state=0;
  17.     ret = ioctl(fd, CMD_RELEASE_GPIO, &userdata);
  18.     return ret;
  19. }

  20. static jint openGpioDev(JNIEnv *env, jobject thiz){


  21.     jint ret=0;

  22.     fd = open("/dev/luobogpio", O_RDWR);
  23.     if (fd < 0) {
  24.         ret=-1;
  25.     }
  26.     return ret;
  27. }

  28. static jint closeGpioDev(JNIEnv *env, jobject thiz){


  29.     jint ret=0;

  30.     ret = close(fd);
  31.     if (fd < 0) {
  32.         ret=-1;
  33.     }
  34.     return ret;
  35. }

  36. static jint setGpioState(JNIEnv *env, jobject thiz,jint num,jint state) {
  37.     jint err=-1;
  38.     UserData userdata;
  39.     memset(&userdata,0x00, sizeof(UserData));
  40.     userdata.gpio=num;
  41.     userdata.state=state;

  42.     err = ioctl(fd, CMD_SET_GPIO, &userdata);
  43.     if(err<0){
  44.         err=-1;
  45.     }
  46.     return err;
  47. }
复制代码


APP:

  1. public class LuoboHardware {



  2.     static {
  3.         // The runtime will add "lib" on the front and ".o" on the end of
  4.         // the name supplied to loadLibrary.
  5.         System.loadLibrary("app");
  6.     }

  7.     public native int add(int a, int b);
  8.     public native int openGpioDev();
  9.     public native int closeGpioDev();
  10.     public native int getGpio(int num);
  11.     public native int releaseGpio(int num);
  12.     public native int setGpioState(int num,int state);
  13. }
复制代码

写了个简单的应用,可以用以下这些方法控制GPIO了,记得控制的时候,先给驱动节点权限,adb root ->adb shell chmod 777 dev/luobogpio   
    public native int openGpioDev();
    public native int closeGpioDev();
    public native int getGpio(int num);
    public native int releaseGpio(int num);
    public native int setGpioState(int num,int state);



作者: zhansb    时间: 2015-8-25 17:39
清晰明了,支持一个:victory:
作者: carlinluo    时间: 2015-8-25 17:50
zhansb 发表于 2015-8-25 17:39
清晰明了,支持一个

:lol偷懒了很多。。。
作者: zqh1630    时间: 2015-9-9 18:02
xuexi ..
作者: 刺客信条    时间: 2015-9-17 11:35
直接 在上层app用JNI可以实现吗?
作者: haoge921026    时间: 2015-9-24 09:58
:D请问下,有没有这个工程的源码?能否发一个!:hug:
作者: kpkdz    时间: 2015-9-27 14:13
站在旁边看看,因为脑子里好糊涂。
作者: andy899    时间: 2015-9-29 21:50
给版主建议能像 FriendlyARM 友善之臂那样提供 IO/I2C/SPI/PWM... 基本的android studio 的完整例程和文件, 这样有利大家对这平台的使用和学习。
作者: carlinluo    时间: 2015-10-8 15:08
本帖最后由 carlinluo 于 2015-10-8 15:09 编辑

上传源码,里面东西太乱,用android studio 1.3.2编译。没有时间整理,有需要的看看

luobotools.zip

4.02 MB, 下载次数: 2371, 下载积分: 灯泡 -1 , 经验 -1

gpio-jni源码


作者: carlinluo    时间: 2015-10-8 15:17
-->kernel/drivers/misc/luobo_gpio.c
-->kernel/drivers/misc/Makefile add  obj-$(CONFIG_LUOBO_GPIO)        += luobo_gpio.o

luobo_gpio.rar

1.36 KB, 下载次数: 639, 下载积分: 灯泡 -1 , 经验 -1

driver


作者: sunwingman    时间: 2015-10-12 15:04
请问版主/dev/luobogpio是否有设定存取权限?

之前在FriendlyARM都会在init.rc里面做设定:
chmod 0666 /dev/xxx (xxx依据driver所define的DEVICE_NAME来设定)



作者: freexiaoting    时间: 2015-12-16 11:28
mark
作者: ocajack    时间: 2016-3-14 18:08
不错
作者: yujian596    时间: 2016-3-22 21:03
学习一下
作者: chencong0513    时间: 2016-5-15 10:32
学习一下!多谢分享!
作者: ssfighter    时间: 2016-5-19 13:30
sunwingman 发表于 2015-10-12 15:04
请问版主/dev/luobogpio是否有设定存取权限?

之前在FriendlyARM都会在init.rc里面做设定:

需要设置权限的,否则app没有权限访问该节点。但是必须说明,这种方法只适用于测试,正式产品是不能用这样的架构的,因为0666或者0777都是过不了CTS的。
作者: mayaxie    时间: 2016-5-28 14:59
站在旁边看看,因为脑子里好糊涂。
作者: ljj3166    时间: 2016-5-31 16:23
好强大,赞一个
作者: pxm137344740    时间: 2016-7-5 11:39
carlinluo 发表于 2015-10-8 15:08
上传源码,里面东西太乱,用android studio 1.3.2编译。没有时间整理,有需要的看看

我去恶趣味请问请问企鹅去除
作者: pxm137344740    时间: 2016-7-5 15:19
我使用的是rk的平台 没有/dev/luobogpio节点  需要怎么去弄
作者: luguo1983    时间: 2016-7-5 23:04
好东西
作者: AacDir    时间: 2016-7-6 11:41
楼主你好,请问如何生成/dev/luobogpio 节点, 我这边参照你的代码,没有生成这样的节点。
安卓5.1
作者: stanleyfang    时间: 2016-7-14 11:05
多谢楼主
作者: Mcgoh    时间: 2016-7-15 00:13

多谢楼主
作者: xiaofei    时间: 2016-7-26 10:27
谢谢
作者: michael18    时间: 2016-7-26 16:48
学习一下,谢谢!
作者: feng3327    时间: 2016-7-27 09:25
AacDir 发表于 2016-7-6 11:41
楼主你好,请问如何生成/dev/luobogpio 节点, 我这边参照你的代码,没有生成这样的节点。
安卓5.1

我也没生成啊,内核也加了
作者: 214740484    时间: 2016-7-27 09:47
{:3_41:}楼主威武!
作者: biaon    时间: 2016-8-7 18:49
carlinluo 发表于 2015-10-8 15:17
-->kernel/drivers/misc/luobo_gpio.c
-->kernel/drivers/misc/Makefile add  obj-$(CONFIG_LUOBO_GPIO)   ...

话说版主应该得把dts修改的不分贴上,这样就更明了了:D
作者: yangze    时间: 2016-8-8 09:53
AacDir 发表于 2016-7-6 11:41
楼主你好,请问如何生成/dev/luobogpio 节点, 我这边参照你的代码,没有生成这样的节点。
安卓5.1

你好 ,我的也是安卓 5.1  没有生成 这个节点 ,rk 给的wiki介绍的如此范范,唉
作者: yangze    时间: 2016-8-8 10:31
carlinluo 发表于 2015-10-8 15:17
-->kernel/drivers/misc/luobo_gpio.c
-->kernel/drivers/misc/Makefile add  obj-$(CONFIG_LUOBO_GPIO)   ...

能问一下 你的  dts是怎么修改的吗??thks
作者: Gabrielice    时间: 2016-8-11 13:46
正有此需求,谢谢分享
作者: wangpeng1108    时间: 2016-8-24 20:45
谢谢分享!!
作者: netman_006    时间: 2016-8-28 18:29
参考一下,正要用
作者: netman_006    时间: 2016-8-28 18:41
abcxyztt 发表于 2016-8-14 21:31
其实gpio的控制也有其他方法

还有什么方法,这个方法要权限,只适合测试,正式的用不了
作者: wangpeng1108    时间: 2016-9-8 16:56
谢谢楼主分享!!!{:3_48:}
作者: lrghl88    时间: 2016-9-8 17:18
thanks share.
作者: Eason    时间: 2016-9-9 09:32
正有此需求,谢谢分享
作者: alaode    时间: 2016-9-11 06:42
make
作者: edisondeng    时间: 2016-9-19 14:27
太好了!
作者: edisondeng    时间: 2016-9-19 14:27
太好了!
作者: williamlou    时间: 2016-9-23 22:08
太好了!
作者: 金子逸    时间: 2016-10-11 20:37
请问这个驱动是如何在DEV目录下生成节点的?   可以详细的介绍一下吗 ?  感激不尽
作者: 金子逸    时间: 2016-10-11 20:40
yangze 发表于 2016-8-8 10:31
能问一下 你的  dts是怎么修改的吗??thks

请问? 你成功了吗? 最后是如何在dev下加入节点的呢?  感激不尽
作者: 金子逸    时间: 2016-10-13 00:25
再问 请问root权限是什么时候给的呢?
作者: 微笑    时间: 2016-10-13 18:19
楼主好人

作者: chengkni    时间: 2016-10-24 13:45
以前看全志的注册JNI的好麻烦。
直接注册的Model什么的。
作者: wangpeng1108    时间: 2016-10-31 09:47
感谢分享!!
作者: xmimixiao    时间: 2016-11-4 16:30
谢谢楼主分享
作者: 蓝色天空    时间: 2017-1-9 14:44
好帖,是我想要的内容,谢谢!
作者: jethorse    时间: 2017-3-6 23:29
谢谢~~~
作者: matt_chou    时间: 2017-3-31 10:22

感谢分享!!
作者: leeoliver    时间: 2017-4-6 10:23
mark
作者: 1chick    时间: 2017-4-14 12:58
试试吧
作者: lzc    时间: 2017-4-14 14:27
学习……
作者: tpoisonooo    时间: 2017-4-15 11:48
我这边没有生成/dev/luobo-gpio,需要在dtsi上加个对应的compatible么?
作者: 13660810415    时间: 2017-5-8 16:16
能用么
作者: z3j6w9    时间: 2017-5-12 08:26
学习了,可以当作是jni的标准模板来学习。
作者: 吟风子燕    时间: 2017-5-16 16:55
carlinluo 发表于 2015-10-8 15:17
-->kernel/drivers/misc/luobo_gpio.c
-->kernel/drivers/misc/Makefile add  obj-$(CONFIG_LUOBO_GPIO)   ...

感谢感谢
作者: 吟风子燕    时间: 2017-5-16 16:59
感谢,感谢,学习了
作者: heroxue    时间: 2017-5-24 22:59
谢谢版主
作者: 加菲猫    时间: 2017-5-25 14:19
支持,学习一下
作者: zygcs    时间: 2017-6-7 15:56

作者: zygcs    时间: 2017-6-7 15:57
不需要DTS了
作者: taohaibing    时间: 2017-6-8 10:50
.compatible = "luobogpio"  对应的dts怎么配置的,发给大家看看,谢了
作者: lk_zhp    时间: 2017-6-8 19:48
好东西,借鉴下。
作者: aaaaa-ray    时间: 2017-6-12 10:00
感謝分享
作者: liyuyinfffewww    时间: 2017-6-15 09:05

作者: zygcs    时间: 2017-7-9 21:55
没看到dts 啊
作者: aaaaa-ray    时间: 2017-7-21 10:50
请问luobo_gpio须设定dts才可在机器上使用吗??
我看运行起来的机器没有luobo_gpio这个档案.
作者: aaaaa-ray    时间: 2017-7-24 17:12
这边真的没人有DTS档吗?
作者: JamesPond    时间: 2017-8-10 10:21
-->kernel/drivers/misc/Makefile add  obj-$(CONFIG_LUOBO_GPIO)        += luobo_gpio.o
不會編譯, 要在
-->kernel/drivers/misc/Kconfig add
config LUOBO_GPIO
        tristate "Luobo gpio control"
        default y
-->kernel
        make menuconfig -> Device Drivers -> Mics devices -> <*>Luobo goip control
        make -j8 firefly-rk3288.img才會編譯出, 但出現
                CC      drivers/misc/luobo_gpio.o
                drivers/misc/luobo_gpio.c:21:1: warning: useless storage class specifier in empty
                declaration [enabled by default]
                error, forbidden warning: luobo_gpio.c:21
                make[2]: *** [drivers/misc/luobo_gpio.o] Error 1
                make[1]: *** [drivers/misc] Error 2
                make[1]: *** Waiting for unfinished jobs....
        將 static struct UserData { 的 static 去除, 則編譯成功.
最後, 高高興興的升級kernel.img, 可是dev\luogogpio怎麼沒看到????
請問版主, 哪個步驟錯了, 怎麼修改? (註:我是寫android的,linux是小白中的小白)

作者: rk3368    时间: 2017-8-31 14:40
刚好有用,一个很不错的参考程序
作者: dove    时间: 2017-9-7 14:25
下载下来看看
作者: glantang    时间: 2017-9-10 23:45
不错, Try it!! Thanks
作者: happylin    时间: 2017-11-22 16:25
怎么赚灯泡
作者: happylin    时间: 2017-11-22 16:34
谢谢楼主

作者: she540061941    时间: 2017-12-7 16:26
学习一下
作者: da1990    时间: 2017-12-16 10:00
写的蛮好  mark
作者: wenge    时间: 2018-1-15 15:35
学习学习
作者: loading    时间: 2018-2-5 14:54
ssfighter 发表于 2016-5-19 13:30
需要设置权限的,否则app没有权限访问该节点。但是必须说明,这种方法只适用于测试,正式产品是不能用这 ...

正式产品是不能用这样的架构的,因为0666或者0777都是过不了CTS的。---请问正式产品有什么架构?

作者: 小猪崽    时间: 2018-6-1 15:52
楼主有详细一点的说明没?
作者: 小东ex    时间: 2018-6-15 09:47

作者: itktfim123    时间: 2018-6-21 15:20
楼主好人
作者: sgg19964    时间: 2018-7-11 19:41
答主怎么才能修改设备节点权限?我自己写了一个之后jni没有权限打开设备节点?每次都需要手动修改吗?

作者: z1w2r3    时间: 2018-7-16 21:22
感谢分享
作者: 小坦克    时间: 2018-7-18 15:59
666
作者: huang501707088    时间: 2018-8-3 10:14
正需要,谢谢
作者: huang501707088    时间: 2018-8-3 10:17

正需要,谢谢
作者: zenglq    时间: 2018-8-21 16:22
为什么我不能下载资源;提示你所在的用户组无法下载或者查看附件
作者: myafeier    时间: 2018-9-17 18:33
有头无尾都是精华,可见社区人气之差!
作者: liangs    时间: 2018-9-20 17:06
感谢分享!!
作者: liangs    时间: 2018-9-20 17:13
感谢分享!!!
作者: wx_追命_V7DI2    时间: 2018-9-21 15:50
为什么我下载不了
作者: pochuang    时间: 2018-10-5 17:39
同求,相关文档实在太少
作者: xiaoshi_xiaoshi    时间: 2018-10-13 23:05
为什么我看不到下载的资源?
作者: xiaoshi_xiaoshi    时间: 2018-10-13 23:13
不错的资料
作者: ?_S9mm1    时间: 2018-11-6 11:41
很好的资料,自己来试试
作者: 15221343353    时间: 2018-11-23 16:33
mark 新人 参考参考 很有用
作者: wx_Tracy_hht5C    时间: 2018-12-24 16:34
AacDir 发表于 2016-7-6 11:41
楼主你好,请问如何生成/dev/luobogpio 节点, 我这边参照你的代码,没有生成这样的节点。
安卓5.1

/sys/bus/platform/drivers/luobogpio 下有这个,但是dev/下没有




欢迎光临 Firefly开源社区 (https://dev.t-firefly.com/) Powered by Discuz! X3.1