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

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

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

2019-12-12 00:23:54
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

http://m.survivalescaperooms.com/article/152879.htm上節(jié),我們明白了proc文件系統(tǒng)的作用,接下來(lái)我們?cè)谝呀?jīng)寫好的led驅(qū)動(dòng)的基礎(chǔ)上,在proc目錄下創(chuàng)建一個(gè)文件夾,然后加入led驅(qū)動(dòng)的版本信息讀取。

我們?cè)趇nit函數(shù)的最后加入:

//定義proc文件系統(tǒng)節(jié)點(diǎn)struct proc_dir_entry *dev_dir , *dev_version;//創(chuàng)建一個(gè)目錄dev_dir = proc_mkdir("Tiny4412_leds", NULL); //創(chuàng)建一個(gè)文件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 ;}

大功告成!!

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

修改的源碼:

#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é)點(diǎn) struct proc_dir_entry *dev_dir , *dev_version; //創(chuàng)建一個(gè)目錄 dev_dir = proc_mkdir("Tiny4412_leds", NULL);  //創(chuàng)建一個(gè)文件 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é)

以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,謝謝大家對(duì)武林網(wǎng)的支持。如果你想了解更多相關(guān)內(nèi)容請(qǐng)查看下面相關(guān)鏈接

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 图木舒克市| 会同县| 岫岩| 泰和县| 华容县| 顺平县| 聊城市| 翼城县| 龙川县| 玉树县| 京山县| 资阳市| 威远县| 富顺县| 汕尾市| 贡觉县| 油尖旺区| 香港 | 囊谦县| 阳朔县| 通城县| 镇平县| 建昌县| 台湾省| 长丰县| 班玛县| 特克斯县| 电白县| 霍林郭勒市| 江津市| 东港市| 石棉县| 乳源| 志丹县| 玛多县| 广元市| 泗洪县| 峨眉山市| 肥西县| 聊城市| 博罗县|