1. 程式人生 > >全志A20 GPIO 總結文件

全志A20 GPIO 總結文件

/*
 * author:          [email protected]
 * Agreement:       GPL.
 */

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>

#define GPIO_SET      0xAC  
#define GPIO_GET      0xAB

#define DEVICE_FILE "/dev/gpio_cdev"

typedef struct {
    unsigned char count;  //GPIO序列
    unsigned char data;   //GPIO電平狀態
} gpio_userspace_t;

/*main*/
int main(/* int argc, char **argv */)
{
    /*open*/
    int gpio_fd, ret;

    gpio_fd = open(DEVICE_FILE, O_RDWR);    //讀寫許可權開啟檔案
    if (gpio_fd < 0) {
        printf("gpio device fail to open.\n");
        return -1;
    }
    printf("%s opend.\n", DEVICE_FILE);

#if 1
    /*write*/
    gpio_userspace_t write_gpio;
    write_gpio.count = 5;   //GPIO序列號
    write_gpio.data = 1;    //GPIO電平值

    printf("write: count = %d , data = %d.\n", write_gpio.count, write_gpio.data);

    ret = write(gpio_fd, &write_gpio, sizeof(gpio_userspace_t));
    if (ret < 0) {
        printf("%s fail to write.\n", DEVICE_FILE);
        return -1;
    }
#endif

    /*ioctl*/
    gpio_userspace_t ioctl_gpio;
    ioctl_gpio.data = 0xff;     //level:0xff
    ioctl_gpio.count = 5;       //pin:4

    ret = ioctl(gpio_fd, GPIO_SET, &ioctl_gpio);
    if (ret < 0) {
        printf("ioctl: ioctl fail.\n");
        return -1;
    }

    /*read*/
    gpio_userspace_t read_gpio;

    ret = read(gpio_fd, &read_gpio, sizeof(gpio_userspace_t));
    if (ret < 0) {
        printf("read: fail to read.\n");
        return -1;
    }
    printf("read: count = %d, data = %d.\n", read_gpio.count, read_gpio.data);

    /*close*/
    close(gpio_fd);
    printf("%s close.\n", DEVICE_FILE);

    return 0;
}
#include <linux/fs.h>
#include <linux/types.h>
#include <linux/module.h>
#include <linux/errno.h>
#include <linux/kernel.h>
#include <linux/init.h>
#include <linux/cdev.h>
#include <linux/platform_device.h>
#include <linux/utsname.h>
#include <asm/uaccess.h>
#include <asm/io.h>
#include <mach/sys_config.h>
#include <mach/includes.h>
#include <linux/gpio.h>
#include <linux/delay.h>


/**********************************************************/
#define GPIO_SET      0xAC  
#define GPIO_GET      0xAB 


/**********************************************************/
script_item_u *gpio_list = NULL;


//gpio_userspace_t 和 gpio_pdata_t 在序列上是一一對應的關係.
typedef struct {
    unsigned char count;      //IO序列:0,1,2,..., 19.
    unsigned char data;       //IO電平.
} gpio_userspace_t;


typedef struct {
    struct gpio_config gpio;
    char gpio_name[32];
    int gpio_cnt;
} gpio_pdata_t;


typedef struct {
//debug tag for printk
    #define __DEBUG_TAG__
    #ifdef __DEBUG_TAG__
        #define dprintk(fmt, arg...) printk(fmt, ## arg)
    #else
        #define dprintk(fmt, arg...)  
    #endif


//char device name: /dev/gpio_cdev
    #define DEVICE_NAME "gpio_cdev"


//multiple
    #define MUL_SEL_INPUT   0
    #define MUL_SEL_OUTPUT  1


//char device 
    struct cdev *gpio_cdev;
    dev_t devid;
    struct class *gpio_class;
//gpio count 
    int gpio_cnt;
//general gpio subsystem
    gpio_pdata_t pin[20];


//
} gpio_info_t;
static gpio_info_t info;


//global gpio pin record:
char pin_count;


/**********************************************************/
static int gpio_cdev_open(struct inode *inode, struct file *file)
{
    dprintk("[gpio]: gpio_cdev_open fn.\n");
<span style="white-space:pre">	</span>return 0;
}


static int gpio_cdev_release(struct inode *inode, struct file *file)
{
    dprintk("[gpio]: gpio_cdev_release fn.\n");
<span style="white-space:pre">	</span>return 0;
}


/**********************************************************/
//write
static ssize_t gpio_cdev_write(struct file *file, const char __user *buf, \
        size_t count, loff_t *ppos)
{
    gpio_userspace_t write_gpio;
    unsigned char write_data, write_count;


    dprintk("[gpio]: gpio_cdev_write fn.\n");


    copy_from_user(&write_gpio, (gpio_userspace_t *)buf, sizeof(gpio_userspace_t));
    write_data = write_gpio.data;
    write_count = write_gpio.count;
    dprintk("[gpio][write]: data=%d, count=%d.\n", write_data, write_count);


    //error correction.
    if ((write_data != 0) && (write_data != 1)) {
        dprintk("[gpio][write][error]: write_data invalid.\n"); 
    }
    if ((write_count < 0) || (write_count >19)) {
        dprintk("[gpio][write][error]: write_count does not exit.\n");   
    }


    gpio_direction_output(info.pin[write_count].gpio.gpio, write_data);
    //mdelay(1);


    return 0;
}


//read 
static ssize_t gpio_cdev_read(struct file *file, char __user *buf, \
        size_t count, loff_t *ppos)
{
    int i;
    unsigned char data;
    unsigned int gpio;
    gpio_userspace_t read_gpio;


    dprintk("[gpio]: gpio_cdev_read fn.\n");


#if 0
    gpio_userspace_t read_gpio[20];
    for (i = 0; i < 20; i++) {
        gpio = info.pin[i].gpio.gpio;
    //除錯用;不要輕易開啟:
    #if 0
        if(0 != gpio_direction_input(gpio)) {
            dprintk("set to input failed.\n");
            continue;
        }
    #endif
        data = __gpio_get_value(gpio);


        read_gpio[i].count = i;    
        read_gpio[i].data = data;
        dprintk("[gpio][read]: pin_%d = %d.\n", read_gpio[i].count, read_gpio[i].data);
    }
    copy_to_user(buf, read_gpio, 20*sizeof(gpio_userspace_t));
#else
    i = pin_count;
    dprintk("[gpio][read]: pin_count = %d.\n", i);
    gpio = info.pin[i].gpio.gpio;
    data = __gpio_get_value(gpio);


    read_gpio.count = i;    
    read_gpio.data = data;
    dprintk("[gpio][read]: count = %d; data = %d.\n", read_gpio.count, read_gpio.data);
    copy_to_user(buf, &read_gpio, sizeof(gpio_userspace_t));
#endif


    return 0;
}


static long gpio_cdev_ioctl(struct file *file, unsigned int cmd, \
        unsigned long arg)
{
    dprintk("[gpio]: gpio_cdev_ioctl fn;");
    dprintk(" cmd = %d.\n", cmd);


    void __user *uarg;  
    uarg = (void __user *)arg;  
    gpio_userspace_t ioctl_gpio;
    copy_from_user(&ioctl_gpio, (gpio_userspace_t *)uarg, sizeof(gpio_userspace_t));  
    dprintk("[gpio]:count = %d, data = %d.\n", ioctl_gpio.count, ioctl_gpio.data);


    switch(cmd) {
    case GPIO_SET:
        dprintk("[gpio]: ioctl cmd = GPIO_SET.\n");
        pin_count = ioctl_gpio.count;
        dprintk("[gpio]: pin_count = %d.\n", pin_count);
        if ((pin_count > 19)|| (pin_count < 0)) {
            dprintk("[gpio][error]: gpio_cdev_ioctl: pin_count invalide.\n"); 
        }
        break;


    case GPIO_GET:
        dprintk("[gpio]: ioctl cmd = GPIO_SET.\n");
        break;


    default:
        dprintk("[gpio]: ioctl cmd = default.\n");
        break;
    }


    return 0;
}


static const struct file_operations gpio_cdev_fops = {
    .owner          = THIS_MODULE,
    .open           = gpio_cdev_open,
    .release        = gpio_cdev_release,
    .write          = gpio_cdev_write,
    .read           = gpio_cdev_read,
    .unlocked_ioctl = gpio_cdev_ioctl,
};

static int gpio_fetch_config(void)
{


    char buffer[32] = {};
    int i;
    int cnt = info.gpio_cnt;
    script_item_value_type_e  type;
    script_item_u   val;


    dprintk("[gpio]: gpio_fetch_config fn.\n");


    dprintk("[gpio]: gpio_cnt=%d.\n", cnt);


    dprintk("--------------------\n");
    for(i=0; i< cnt; i++) {
        //format sprintf
        sprintf(buffer, "gpio_pin_%d", i);
        dprintk("[gpio]: buffer=%s.\n", buffer);
        //fetch gpio_pin_# issue
        type = script_get_item("gpio_para", buffer, &val);
        if (SCIRPT_ITEM_VALUE_TYPE_PIO != type) {
            dprintk("[gpio]: item value type INVALID.\n");
            return -1;
        }
        else {
            info.pin[i].gpio.gpio = val.gpio.gpio;
            info.pin[i].gpio.mul_sel = val.gpio.mul_sel;
            dprintk("[gpio][pin%d]: gpio=%d, mul_sel=%d, ", i, info.pin[i].gpio.gpio, info.pin[i].gpio.mul_sel);
            strcpy(info.pin[i].gpio_name, buffer); 
            dprintk("name=%s, ", info.pin[i].gpio_name);
            info.pin[i].gpio_cnt = i;
            dprintk("gpio_cnt=%d.\n", info.pin[i].gpio_cnt);
            dprintk("--------------------\n");
        }


    } 


    dprintk("[gpio]: success to gpio_fetch_config.\n");
    return 0;
}


static int __init gpio_module_init(void)
{
    int ret = 0, err;
    int cnt = 0, i;
    script_item_value_type_e  type;
    script_item_u   val;


    dprintk("[gpio]: gpio_module_init fn.\n");


    ret = alloc_chrdev_region(&(info.devid), 0, 20, DEVICE_NAME);
    if ( ret ) {
        dprintk("[gpio]: fail to alloc_chrdev_region.\n");
        return -1;
    }
    dprintk("[gpio]: devid major=%d, minor=%d.\n", MAJOR(info.devid), MINOR(info.devid));


    info.gpio_cdev = cdev_alloc();
    cdev_init(info.gpio_cdev, &gpio_cdev_fops);
    info.gpio_cdev->owner = THIS_MODULE;
    err = cdev_add(info.gpio_cdev, info.devid, 1);
    if (err) {
        dprintk("[gpio]: cdev_add fail.\n");
        return -1;
    }


    info.gpio_class = class_create(THIS_MODULE, DEVICE_NAME);
    if (IS_ERR(info.gpio_class)) {
        dprintk("[gpio]: class_create fail.\n");
        return -1;
    }
    
<span style="white-space:pre">	</span>device_create(info.gpio_class, NULL, info.devid, NULL, DEVICE_NAME);
<span style="white-space:pre">	</span>
    dprintk("[gpio]: success to create a gpio cdev.\n");


    //
    type = script_get_item("gpio_para", "gpio_used", &val);
    if (SCIRPT_ITEM_VALUE_TYPE_INT != type) {
        dprintk("[gpio]: type not right.\n"); 
        return -1;
    }
    if (!val.val) {
        dprintk("[gpio]: gpio is not used.\n");
        return -1;
    }
    dprintk("[gpio]: gpio is used.\n");
    
    //
    cnt = script_get_pio_list("gpio_para", &gpio_list);
    dprintk("[gpio]: cnt = %d.\n", cnt);
    info.gpio_cnt = cnt;
    if (cnt == 0) {
        dprintk("[gpio]: fail to script_get_pio_list.\n");
        return -1;
    }
    else {
        dprintk("[gpio]: requeset gpio(s).\n"); 
        for (i=0; i < cnt; i++) {
            dprintk("[gpio]: requeset gpio No.%d.\n", i+1); 
            if (0 != gpio_request(gpio_list[i].gpio.gpio, NULL)) 
                dprintk("[gpio]: i = %d; fail to gpio_request.\n", i); 
        }
    
    }
    //dprintk("[gpio]: 1.\n"); 


    //config gpio.
    if (0 != sw_gpio_setall_range(&gpio_list[0], cnt)) {
        dprintk("[gpio]: fail to sw_gpio_setall_range.\n");
        return -1; 
    }


    //dprintk("[gpio]: 2.\n"); 
    /*************************************************************/
    gpio_fetch_config();
    //dprintk("[gpio]: 3.\n"); 


#if 0
    //test gpio.
    gpio_direction_output(info.pin[4].gpio.gpio, 0);
    mdelay(5);
    gpio_direction_output(info.pin[4].gpio.gpio, 1);
    mdelay(5);
#endif


    //dprintk("[gpio]: 4.\n"); 
<span style="white-space:pre">	</span>return 0;
}


static void __exit gpio_module_exit(void)
{
    dprintk("[gpio]: gpio_module_exit fn.\n");
        <span style="white-space:pre">	</span>
    device_destroy(info.gpio_class,  info.devid);
    class_destroy(info.gpio_class);
    cdev_del(info.gpio_cdev);
}


module_init(gpio_module_init);
module_exit(gpio_module_exit);


MODULE_AUTHOR("
[email protected]
"); MODULE_DESCRIPTION("gpio driver"); MODULE_LICENSE("GPL");

相關推薦

A20 GPIO 總結

/* * author: [email protected] * Agreement: GPL. */ #include <stdio.h> #include <stdlib.h> #include &

C#流總結(流、內存流、網絡流、BufferedStream、StreamReader/StreamWriter、TextReader/TextWriter)

accept ron 格式 初始 oar listener style ble 流數據 一、文件流FileStream類主要用於讀寫磁盤文件。常用於向磁盤存儲數據或讀取配置文件。讀取文件:復制代碼 //文件流:讀取 FileStream fileStream = F

npm局安裝和局部安裝區別

升級 png tor 為我 9.png 依賴 req 就是 全局環境 全局安裝往往是安裝一個工具,他不是安裝在一個文件夾下,而是安裝在某個全局環境下,如目前我的安裝路徑是: C:\Users\cvter\AppData\Roaming\npm   在這裏,我們可以看到

Java Web學習總結-下載

web應用 ping 輸入 -c resp 圖片 url RM var   在Web應用系統開發中,文件上傳和下載功能是非常常用的功能,今天來講一下JavaWeb中的文件下載功能的實現。   直接貼圖和代碼:   1、文件列表      2、在Web.xml文件

【mpeg2】MPEG-2標準總結

Date: 2018.10.24 0、前言     本文件是MPEG-2標準的學習總結文件,主要講述了MPEG-2標準基本知識、碼流分層結構、碼流的句法和語義以及視訊流的解碼過程,相對比較詳細,可供學習標準層面的知識。 1、MPEG-2簡介     MPEG組織於1

史上最面的Spring Boot配置詳解

\n 系統環境 dfa 文件比較 打包 body XML contex 字符 Spring Boot在工作中是用到的越來越廣泛了,簡單方便,有了它,效率提高不知道多少倍。Spring Boot配置文件對Spring Boot來說就是入門和基礎,經常會用到,所以寫下做個總結以

關於總結書寫的感悟

做專案的過程中時常需要記錄,最後把過程的資產變成有助於以後回顧或者使用的工具。因此寫出好的文件非常重要,可以節約自己和他人的時間。寫出簡單易懂的文件方便了問題的理解對自己也是一種提升。 文件就像是我們曾經的作文一樣。以一個專案總結為例,我們首先表明,我們乾的是什麼,實現了預

Tensorflow視訊學習總結

      Tensorflow學習中,在學習了基礎知識和建立簡單模型後,發現可以利用已有函式retrain.py直接採取一個Inception V3架構模型訓練ImageNet影象和訓練新的頂層。這個運用可以不需要基礎就運用起來,如果想認識retrain.p

a20 android原始碼 修改螢幕亮度

1. 修改android系統顯示亮度的最大最小限制         修改 frameworks\base\core\res\res\values\config.xml  (很多預設配置都是在這個檔案裡修改的)以下程式碼     <!-- Minimum screen

DRDS總結

一、DRDS背景 單機資料庫能夠方便的滿足使用者對於關係查詢類的需求,是目前業務應用中最常使用的軟體。然而,對於很多應用而言,單機資料庫最終都會遇到瓶頸, 包括訪問量、資料容量、擴充套件性等等會碰到各類限制,特別在網際網路時代,這個瓶頸會非常快地碰到,在時間緊張、技術儲備有限的情況下,不得

a20 新增觸控喚醒螢幕功能

      一、螢幕喚醒流程               這部分一開始我也不是很懂,然後百度一下,發現這哥們寫得不錯,所以這部分內容參考一下這個網址      http://blog.csdn.net/shadow_dance/article/details/8070252

windows下 A20 Android script.fex 除錯工具

最近在做全志A20的Android系統開發,經常需要除錯script.fex檔案中的引數。 會經常用到sunxi-tools中的幾個工具 12345678910111213141516fexc:`.fex`file(de)compilerUsage:./fexc[-vq

樹莓派3(A20)Android韌體編譯

編譯android韌體(使用Ubuntu15.10 64位虛擬機器) 更新15.10源 sudo cp /etc/apt/sources.list /etc/apt/sources.list.bak 執行下面命令修改: sudo gedit /etc

VBA(比較的api中文幫助例如office,excel,outlook,PowerPoint等api)

VBA比較全的api幫助文件,裡面具體包括了一下chm 相關截圖如下 1、MSOHLP11.chm中文幫助文件 2、VBAAC10.CHM office的一些幫助文件(如圖) 3、VBAGR10.CHM 4、VBAOF11.CHM 5、VBAO

AndroidA20主機板刷機步驟

1,將SD卡插入電腦,開啟PhoenixCard.exe軟體 2,選擇映象檔案 3,燒寫模式選擇“卡量產” ,然後點選“燒錄” 4,燒寫結束後拔出SD卡 5,將SD卡插到板卡上,

React中使用css-module學習總結

css modules1. 為什麼要使用css modules不論是基於pure js或jquery等傳統的前端開發,還是基於react,vue等新框架的開發,都會遇到css汙染的問題。如果專案管理不標準,對於部分頁面定義的css樣式可能會影響到其他頁面的顯示效果,並且這類c

a20修改裝置基本資訊--> 修改 build.prop

由於工作中需要修改到裝置設定頁面裡顯示的基本資訊,百度一下,發現原來是修改system/build.prop下的這個檔案即可,有兩種方法可以修改 第一種:把編譯好的映象解包,修改system/build.prop為想要配置的資訊再打包,即可 第二種:直接在原始碼裡修改 參考

關於A20的Ubuntu12.04 64位系統下環境配置及編譯過程筆記

在安裝Ubuntu系統之後,安裝編譯所需的GCC等工具,一般選用GCC4.4版本的,因為自己在編譯時安裝的是arm-linuc-gnueabi-4.6.3等,所以在編譯時一直報CC1:error等錯誤,在網上查了很多資料,大多數解釋為cc1檔案所在資料夾許可權不夠,後來發現

A20 Android 原始碼編譯

一,安裝adb除錯工具 將目錄中所有的檔案複製到系統的system32的目錄下。接著,就可以在cmd中使用adb命令就可以使用該除錯工具。 二,參看核心列印資訊 >adb shell cat /proc/kmsg > 1.txt //或者直接adb shell cat /proc/km

Ubuntu 15.10 搭建 A20 Android系統編譯環境

1.安裝基礎C/C++編譯庫 sudo apt-get install vim automake make perl gcc g++ sudo apt-get install bison g++-multilib git flex lzop gperf libxml2-ut