Firefly Open Source Community

   Login   |   Register   |
New_Topic
Print Previous Topic Next Topic

FirePrime-RK3128 Android app use jni to control GPIO code

1637

Credits

0

Prestige

0

Contribution

administrator

Rank: 9Rank: 9Rank: 9

Credits
1637

FirePrime-RK3128 Android app use jni to control GPIO code

Posted at 10/12/2015 17:11:56      View:4174 | Replies:0        Print      Only Author   [Copy Link] 1#
Sharing by carlinluo

Driver
  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");
Copy the code


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. }
Copy the code


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. }
Copy the code




Wrote a simple app, you can control GPIO by the following method , DO remember to give permissions to driven node first.

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);
Reply

Use props Report

You need to log in before you can reply Login | Register

This forum Credits Rules

Quick Reply Back to top Back to list