Firefly开源社区

12345... 13
发表新贴
打印 上一主题 下一主题

fireprime-rk3128 android app 通过jni控制GPIO的代码

265

积分

5

威望

6

贡献

实习版主

Rank: 7Rank: 7Rank: 7

积分
265

活跃会员热心会员突出贡献

fireprime-rk3128 android app 通过jni控制GPIO的代码

发表于 2015-8-25 17:23:18      浏览:113159 | 回复:125        打印      只看该作者   [复制链接] 楼主
本帖最后由 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);


回复

使用道具 举报

2918

积分

56

威望

46

贡献

高级创客

Rank: 6Rank: 6

积分
2918

优秀版主论坛元老

发表于 2015-8-25 17:39:17        只看该作者  沙发
清晰明了,支持一个:victory:
回复

使用道具 举报

265

积分

5

威望

6

贡献

实习版主

Rank: 7Rank: 7Rank: 7

积分
265

活跃会员热心会员突出贡献

发表于 2015-8-25 17:50:26        只看该作者  板凳
zhansb 发表于 2015-8-25 17:39
清晰明了,支持一个

:lol偷懒了很多。。。
回复

使用道具 举报

14

积分

0

威望

0

贡献

技术小白

积分
14
发表于 2015-9-9 18:02:55        只看该作者  地板
xuexi ..
回复

使用道具 举报

4

积分

0

威望

0

贡献

游客

积分
4
发表于 2015-9-17 11:35:05        只看该作者  5#
直接 在上层app用JNI可以实现吗?
回复

使用道具 举报

13

积分

0

威望

0

贡献

游客

积分
13
发表于 2015-9-24 09:58:25        只看该作者  6#
:D请问下,有没有这个工程的源码?能否发一个!:hug:
回复

使用道具 举报

19

积分

0

威望

0

贡献

游客

积分
19
发表于 2015-9-27 14:13:57        只看该作者  7#
站在旁边看看,因为脑子里好糊涂。
回复

使用道具 举报

20

积分

0

威望

0

贡献

游客

积分
20
发表于 2015-9-29 21:50:50        只看该作者  8#
给版主建议能像 FriendlyARM 友善之臂那样提供 IO/I2C/SPI/PWM... 基本的android studio 的完整例程和文件, 这样有利大家对这平台的使用和学习。
回复

使用道具 举报

265

积分

5

威望

6

贡献

实习版主

Rank: 7Rank: 7Rank: 7

积分
265

活跃会员热心会员突出贡献

发表于 2015-10-8 15:08:29        只看该作者  9#
本帖最后由 carlinluo 于 2015-10-8 15:09 编辑

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

luobotools.zip

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

gpio-jni源码

点评

我也下不了,你所在的用户组无法下载  发表于 2018-11-23 16:35
为什么我下载不了  发表于 2018-9-21 15:11
回复

使用道具 举报

265

积分

5

威望

6

贡献

实习版主

Rank: 7Rank: 7Rank: 7

积分
265

活跃会员热心会员突出贡献

发表于 2015-10-8 15:17:58        只看该作者  10#
-->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

点评

权限不够,急需  发表于 2021-3-10 15:20
回复

使用道具 举报

返回列表
12345... 13
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

友情链接 : 爱板网 电子发烧友论坛 云汉电子社区 粤ICP备14022046号-2
快速回复 返回顶部 返回列表