国产毛片a精品毛-国产毛片黄片-国产毛片久久国产-国产毛片久久精品-青娱乐极品在线-青娱乐精品

【Rayeager PX2】PX2上使用GPIO口的例程

發布時間:2015-7-8 17:28    發布者:穿prada的008
關鍵詞: GPIO
之前樓主在論壇中已經分享了簡單驅動的編寫,現在樓主再來教剛接觸板子的新手們如何引用調用GPIO,不過這里樓主并沒有將GPIO口的函數封裝成庫,然后在eclipse上調用,樓主這邊的例子,只是簡單的用adb工具進入板中,然后用一個測試程序使用端口,有興趣想要在安卓界面調用端口的,可以參考樓主之前寫的那編jni調用的帖子。
首先我們依舊來簡單地說下步驟,
1.在/kernel/drivers下建個文件夾,自己創建并添加Kconfig和makefile,內容如下,

   

2.在該目錄下寫個gpio驅動,內容在最后
3.返回drivers目錄,在目錄下修改Kconfig和makefile,修改內容如下
   
4.進入內核,打開已寫好的驅動。
  
驅動內容如下,
/***********************************************************************************
* driver for GPIO
*   
**********************************************************************************/
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include

#define DEVICE_NAME "rkpx2_GPIO" //定義設備名


#define RKPX2_GPIO_MAJOR    101  //定義設備號

static struct class *dev_class//定義設備結構體


static int gpio_open(struct inode *inode, struct file *file)
{
    int i
    int err
    i=0

    err = gpio_request(RK30_PIN4_PD1, "GPIO4_D1")//申請端口gpio4_1,成功返回0,失敗返回負的錯誤值

    if(err)
    {
        printk(KERN_ERR "RK_PX2 failed to request GPIO4_D1 \n")
        return err
    }//若申請失敗,則報錯,然后推出,

    err = gpio_request(RK30_PIN4_PD2, "GPIO4_D2")//申請端口gpio4_2,成功返回0,失敗返回負的錯誤值

    if(err)
    {
        printk(KERN_ERR "RK_PX2 failed to request GPIO4_D2 \n")
        return err
    }
    err = gpio_request(RK30_PIN4_PD3, "GPIO4_D3")//申請端口gpio4_3,成功返回0,失敗返回負的錯誤值

    if(err)
    {
        printk(KERN_ERR "RK_PX2 failed to request GPIO4_D3 \n")
        return err
    }
    err = gpio_request(RK30_PIN4_PD4, "GPIO4_D4")//申請端口gpio4_4,成功返回0,失敗返回負的錯誤值

    if(err)
    {
        printk(KERN_ERR "RK_PX2 failed to request GPIO4_D4 \n")
        return err
    }
    printk(KERN_INFO "RK_PX2 GPIO opened 4 !\n")

    gpio_direction_output(RK30_PIN4_PD1,1)//決定GPIO的方向,為輸出
    gpio_direction_output(RK30_PIN4_PD2,1)
    gpio_direction_output(RK30_PIN4_PD3,1)
    gpio_direction_output(RK30_PIN4_PD4,1)

    return 0

}

static int gpio_close(struct inode *inode, struct file *file)
{
    gpio_free(RK30_PIN4_PD1)
    gpio_free(RK30_PIN4_PD2)
    gpio_free(RK30_PIN4_PD3)
    gpio_free(RK30_PIN4_PD4)    //釋放端口,
    printk(KERN_INFO "RK_PX2 GPIO driver successfully close\n")
    return 0
}

static int gpio_read(struct file *file, char *buffer, size_t size, loff_t *pos) //從內核中讀取GPIO引腳的值
{
     int ret
    char key_buf[4]
    if (gpio_get_value(RK30_PIN4_PD1)==0){
        key_buf[0]=0
    }else{
        key_buf[0]=1
    }
    if (gpio_get_value(RK30_PIN4_PD2)==0){
        key_buf[1]=0
    }else{
        key_buf[1]=1
    }
    if (gpio_get_value(RK30_PIN4_PD3)==0){
        key_buf[2]=0
    }else{
        key_buf[2]=1
    }
    if (gpio_get_value(RK30_PIN4_PD4)==0){
        key_buf[3]=0
    }else{
        key_buf[3]=1
    }
    ret=copy_to_user(buffer,key_buf,4)//拷貝數據到用戶區 ,成功為 0,失敗為字節數

    return ret
}

static long gpio_ioctl(struct file *file ,unsigned int cmd,unsigned long arg){

    switch(cmd){//改變引腳的電平值
        case 00: gpio_set_value(RK30_PIN4_PD1,0)
            printk("GPIO_D1  is low!\n")
            break
        case 01: gpio_set_value(RK30_PIN4_PD1,1)
            printk("GPIO_D1  is high!\n")
            break
        case 10: gpio_set_value(RK30_PIN4_PD2,0)
            printk("GPIO_D2  is low!\n")
            break
        case 11: gpio_set_value(RK30_PIN4_PD2,1)
            printk("GPIO_D2  is high!\n")
            break
        case 20: gpio_set_value(RK30_PIN4_PD3,0)
            printk("GPIO_D3  is low!\n")
            break
        case 21: gpio_set_value(RK30_PIN4_PD3,1)
            printk("GPIO_D3  is high!\n")
            break
        case 30: gpio_set_value(RK30_PIN4_PD4,0)
            printk("GPIO_D4  is low!\n")
            break
        case 31: gpio_set_value(RK30_PIN4_PD4,1)
            printk("GPIO_D4  is high!\n")
            break

    }

    return 0
}

/*驅動接口設置*/
static struct file_operations dev_fops = {
    .owner = THIS_MODULE,
    //.unlocked_ioctl = tq210_gpio_ioctl,
    .open = gpio_open,
    .release = gpio_close,
    .read = gpio_read,
    .unlocked_ioctl = gpio_ioctl,
}

/*初始化設備,配置對應的IO,以及注冊設備*/
static int __init dev_init(void)
{
    int ret
    ret=0
    ret = register_chrdev(RKPX2_GPIO_MAJOR,"rkpx2_GPIO",&dev_fops)//注冊   
    if (ret<0) {
        printk("rkpx2 GPIO for test  unable to get major%d \n",ret)
        return ret
    }
    dev_class = class_create(THIS_MODULE,"rkpx2_GPIO")//初始化
    if (IS_ERR(dev_class)){
        unregister_chrdev(RKPX2_GPIO_MAJOR,"rkpx2_GPIO")
        return PTR_ERR(dev_class)
    }   
    device_create(dev_class,NULL,MKDEV(RKPX2_GPIO_MAJOR,0),NULL,"rkpx2_GPIO")//創建設備
    printk(KERN_INFO "RKPX2 GPIO driver successfully probed!\n")

    return ret
}

/*注銷設備*/
static void __exit dev_exit(void)
{
    //misc_deregister(&dev_misc)
    gpio_free(RK30_PIN4_PD1)
    gpio_free(RK30_PIN4_PD2)
    gpio_free(RK30_PIN4_PD3)
    gpio_free(RK30_PIN4_PD4)
    printk(KERN_INFO "RKPX2 gpio driver successfully exit\n")
}

module_init(dev_init)
module_exit(dev_exit)

MODULE_AUTHOR("Rayeager cyl")        
MODULE_DESCRIPTION("rkpx2 gpio Driver")   
MODULE_LICENSE("GPL")

然后測試程序內容如下:


#include
#include
#include
#include

#define DEVICE_NAME     "/dev/rkpx2_GPIO"
#define LED_OFF    0
#define LED_ON    1

int main(int argc,char **argv){

    int fd
    int ret
    int flag
    int pin
    int ch
    printf("\n start test gpio_drivers\n")
    if(strcmp(argv[1],"open")==0){            
    fd=open(DEVICE_NAME,O_RDWR)
    if (fd==-1){
        printf("open devices %s error\n",DEVICE_NAME)
    }


    printf("input the pin you want to operate")
    scanf("%d",&pin)
    printf("\n")
    printf("it will be set ?(1=on or 0=off):")
    scanf("%d",&ch)

    switch(pin){
    case 0: (ch==1?ioctl(fd,1):ioctl(fd,2))break
    case 1: (ch==1?ioctl(fd,3):ioctl(fd,4))break
    case 2: (ch==1?ioctl(fd,5):ioctl(fd,6))break
    case 3: (ch==1?ioctl(fd,7):ioctl(fd,8))break


}
}



    if(strcmp(argv[1],"close")==0){
         fd=open(DEVICE_NAME,O_RDWR)
        close(fd)   
    }


    return 0

}
Android.mk的內容
LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

LOCAL_SRC_FILES:=\

test.c

LOCAL_MODULE:=gpioapp

include$(BUILD_EXECUTABLE)
編譯測試程序的方法:在源碼任意位置建個目錄,把Android.mk和測試程序全扔進去,然后執行mm(現在根目錄執行source  build/envsetup.sh)




實際操作,過程就不說了,親測可行,正常操作的端口為GPIO4_1234

本文地址:http://m.qingdxww.cn/thread-151236-1-1.html     【打印本頁】

本站部分文章為轉載或網友發布,目的在于傳遞和分享信息,并不代表本網贊同其觀點和對其真實性負責;文章版權歸原作者及原出處所有,如涉及作品內容、版權和其它問題,我們將根據著作權人的要求,第一時間更正或刪除。
chongdazds 發表于 2015-7-9 09:12:24
謝謝樓主分享,不錯不錯
您需要登錄后才可以發表評論 登錄 | 立即注冊

廠商推薦

  • Microchip視頻專區
  • 為何選擇集成電平轉換?
  • 5分鐘詳解定時器/計數器E和波形擴展!
  • 安靜高效的電機控制——這才是正確的方向!
  • 基于CEC1712實現的處理器SPI FLASH固件安全彈性方案培訓教程
  • 貿澤電子(Mouser)專區

相關視頻

關于我們  -  服務條款  -  使用指南  -  站點地圖  -  友情鏈接  -  聯系我們
電子工程網 © 版權所有   京ICP備16069177號 | 京公網安備11010502021702
快速回復 返回頂部 返回列表
主站蜘蛛池模板: 国产一区二区在线看 | 日本韩国一级 | 国产精品久久久免费视频 | 色噜噜狠狠先锋影音久久 | 日韩在线网 | 天堂网站 | 亚洲精品免费日日日夜夜夜夜 | 在线观看免费精品国产 | 白丝美女用脚揉男生的命根 | 在线好吊色视频98gao | 不卡无毒免费毛片视频观看 | 欧美在线视频 一区二区 | 久热亚洲 | 极品美女在线观看免费视频 | 激情综合五月亚洲婷婷 | 亚洲欧美网址 | 亚洲黄色网站视频 | 四虎影院免费观看视频 | 色综合久久中文色婷婷 | 亚洲精品亚洲人成在线观看麻豆 | 免费三级毛片 | 国产在线观看一区二区三区 | 一区二区三区精品国产欧美 | 一区二区三区在线免费观看视频 | 中国一级做a爰片久久毛片 中国一级特黄毛片 | 日韩欧美一区二区三区不卡在线 | 国产精品久久久久久久免费大片 | 午夜国产在线 | 亚洲综合色视频 | 黄页网站在线播放 | 国产精品香蕉夜间视频免费播放 | 韩国免费一级片 | 日本在线视频网站www色下载 | h网站亚洲 | 国产日本韩国不卡在线视频 | 婷婷七月丁香 | 国产在线一区观看 | 午夜hhh视频在线观看hhhh | 亚洲欧美在线免费 | 99久久精品免费看国产交换 | 欧美一区二 |