国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 系統(tǒng) > Android > 正文

Android為Tiny4412設(shè)備驅(qū)動在proc目錄下添加一個可讀版本信息的文件

2019-10-21 21:32:57
字體:
供稿:網(wǎng)友

上節(jié),我們明白了proc文件系統(tǒng)的作用,接下來我們在已經(jīng)寫好的led驅(qū)動的基礎(chǔ)上,在proc目錄下創(chuàng)建一個文件夾,然后加入led驅(qū)動的版本信息讀取。

我們在init函數(shù)的最后加入:

//定義proc文件系統(tǒng)節(jié)點struct proc_dir_entry *dev_dir , *dev_version;//創(chuàng)建一個目錄dev_dir = proc_mkdir("Tiny4412_leds", NULL); //創(chuàng)建一個文件dev_version = create_proc_entry("version", S_IRUGO, dev_dir); //調(diào)用讀版本的函數(shù)dev_version->read_proc = proc_read_version ;

然后編寫獲取版本信息的讀函數(shù):

#define VERSION_LEN 20char Tiny4412_LED_version[VERSION_LEN] = "20170908/n";int proc_read_version(char *page, char **start, off_t off, int count, int *eof,         void *data){ int len ;  len = sprintf(page,Tiny4412_LED_version); //將字符串寫入page,相當(dāng)于copy到用戶層 return len ;}

大功告成!!

接下來編譯完成,將kenel刷入開發(fā)板后卡機,用adb shell進入可以看到如下:

Android,Tiny4412,設(shè)備驅(qū)動,proc

修改的源碼:

#include <linux/kernel.h>#include <linux/module.h>#include <linux/miscdevice.h>#include <linux/fs.h>#include <linux/types.h>#include <linux/moduleparam.h>#include <linux/slab.h>#include <linux/ioctl.h>#include <linux/cdev.h>#include <linux/delay.h>#include <linux/gpio.h>#include <mach/gpio.h>#include <plat/gpio-cfg.h>//添加必要的頭文件#include <linux/proc_fs.h>#include <linux/uaccess.h>#define DEVICE_NAME "leds"static int led_gpios[] = { EXYNOS4212_GPM4(0), EXYNOS4212_GPM4(1), EXYNOS4212_GPM4(2), EXYNOS4212_GPM4(3),};#define LED_NUM ARRAY_SIZE(led_gpios)static long tiny4412_leds_ioctl(struct file *filp, unsigned int cmd, unsigned long arg){ switch(cmd) { case 0: case 1:  if (arg > LED_NUM) {  return -EINVAL;  }  gpio_set_value(led_gpios[arg], !cmd);  //printk(DEVICE_NAME": %d %d/n", arg, cmd);  break; default:  return -EINVAL; } return 0;}static struct file_operations tiny4412_led_dev_fops = { .owner  = THIS_MODULE, .unlocked_ioctl = tiny4412_leds_ioctl,};static struct miscdevice tiny4412_led_dev = { .minor  = MISC_DYNAMIC_MINOR, .name  = DEVICE_NAME, .fops  = &tiny4412_led_dev_fops,};#define VERSION_LEN 20char Tiny4412_LED_version[VERSION_LEN] = "20170908/n";int proc_read_version(char *page, char **start, off_t off, int count, int *eof, void *data){ int len ;  len = sprintf(page,Tiny4412_LED_version); return len ;}static int __init tiny4412_led_dev_init(void) { int ret; int i; for (i = 0; i < LED_NUM; i++) { ret = gpio_request(led_gpios[i], "LED"); if (ret) {  printk("%s: request GPIO %d for LED failed, ret = %d/n", DEVICE_NAME,   led_gpios[i], ret);  return ret; } s3c_gpio_cfgpin(led_gpios[i], S3C_GPIO_OUTPUT); gpio_set_value(led_gpios[i], 1); } //雜類設(shè)備 ret = misc_register(&tiny4412_led_dev); //定義proc文件系統(tǒng)節(jié)點 struct proc_dir_entry *dev_dir , *dev_version; //創(chuàng)建一個目錄 dev_dir = proc_mkdir("Tiny4412_leds", NULL);  //創(chuàng)建一個文件 dev_version = create_proc_entry("version", S_IRUGO, dev_dir);  //調(diào)用讀版本的函數(shù) dev_version->read_proc = proc_read_version ; printk(DEVICE_NAME"/tinitialized/n"); return ret;}static void __exit tiny4412_led_dev_exit(void) { int i; for (i = 0; i < LED_NUM; i++) { gpio_free(led_gpios[i]); } misc_deregister(&tiny4412_led_dev);}module_init(tiny4412_led_dev_init);module_exit(tiny4412_led_dev_exit);MODULE_LICENSE("GPL");MODULE_AUTHOR("FriendlyARM Inc & Y.X.YANG modify");

總結(jié)

以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,謝謝大家對VEVB武林網(wǎng)的支持。


注:相關(guān)教程知識閱讀請移步到Android開發(fā)頻道。
發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 聂拉木县| 漠河县| 迁西县| 长顺县| 涟水县| 兴城市| 建始县| 莆田市| 富锦市| 牟定县| 合山市| 斗六市| 华安县| 寿宁县| 岑溪市| 湄潭县| 绥江县| 伽师县| 灵台县| 漯河市| 满洲里市| 江阴市| 上饶市| 上饶县| 隆回县| 青铜峡市| 蒙自县| 芜湖市| 五指山市| 通河县| 连云港市| 三台县| 海阳市| 同心县| 巴楚县| 红原县| 翁牛特旗| 蒙自县| 永仁县| 奎屯市| 伊吾县|