全志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
Android全志A20主機板刷機步驟
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