Android为Tiny4412设备驱动在proc目录下添加一个可读版本信息的文件
作者:Engineer-Bruce_Yang 发布时间:2022-09-24 05:37:20
标签:tiny4412,proc,目录,信息,文件
https://www.jb51.net/article/152879.htm上节,我们明白了proc文件系统的作用,接下来我们在已经写好的led驱动的基础上,在proc目录下创建一个文件夹,然后加入led驱动的版本信息读取。
我们在init函数的最后加入:
//定义proc文件系统节点
struct proc_dir_entry *dev_dir , *dev_version;
//创建一个目录
dev_dir = proc_mkdir("Tiny4412_leds", NULL);
//创建一个文件
dev_version = create_proc_entry("version", S_IRUGO, dev_dir);
//调用读版本的函数
dev_version->read_proc = proc_read_version ;
然后编写获取版本信息的读函数:
#define VERSION_LEN 20
char 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,相当于copy到用户层
return len ;
}
大功告成!!
接下来编译完成,将kenel刷入开发板后卡机,用adb shell进入可以看到如下:
修改的源码:
#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 20
char 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);
}
//杂类设备
ret = misc_register(&tiny4412_led_dev);
//定义proc文件系统节点
struct proc_dir_entry *dev_dir , *dev_version;
//创建一个目录
dev_dir = proc_mkdir("Tiny4412_leds", NULL);
//创建一个文件
dev_version = create_proc_entry("version", S_IRUGO, dev_dir);
//调用读版本的函数
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");
来源:https://blog.csdn.net/morixinguan/article/details/77823499


猜你喜欢
- IDEA 初使用昨天,我在某位大神的推荐下,下载了idea编辑器,同时被其强大的功能所震撼。此篇文章去帮助新手小白,来安装并,解决idea安
- 用户列表页面开发项目介绍用户列表页面开发,可以实现简单的查询,删除,修改,和添加用户信息功能。前端使用vue框架,后端使用springboo
- 向shell提供命令非常简单,需要学习的注解很少。该命令的实现风格与使用依赖注入的应用程序的开发类相同,您可以利用Spring容器的所有特性
- 什么是EurekaNetflix Eureka 是一款由 Netflix 开源的基于 REST 服务的注册中心,用于提供服务发现功能。Spr
- Guava Cache:⾕歌开源缓存框架Guava Cache是在内存中缓存数据,相比较于数据库或redis存储,访问内存中的数据会更加高效
- 多线程一直是工作或面试过程中的高频知识点,今天给大家分享一下使用 ThreadPoolTaskExecutor 来自定义线程池和实现异步调用
- 简介上一篇我们介绍了在android里如何读写本地文件。我们有一种场景,类似网页的cookie,要把用户的一些储如上一次登录、使用的痕迹等信
- 前言fragment 可认为是一个轻量级的Activity,但不同与Activity,它是要嵌到Activity中来使用的,它用来解决设备屏
- 本文记录了用自定义Camera实现的简单拍照功能。Camera类在5.0以后不推荐使用了,取而代之的是android.hardware.ca
- 回调函数就像activities一样,fragments也有它们自己的生命周期。理解fragments的生命周期,可以使你在它们被销毁的时候
- 专业的Android app开发人员会关注一些成熟的项目管理技术,以成功构建Android app,并让这个app在Google Play
- 在activity级下使用this表示contextkotlin中取消了xxxActivity.this的用法,所以我们可以在activit
- Java类的加载说明Java类的编译代码都存在于它自己的独立文件中(class),该文件只在需要使用程序代码时才会被加载。类加载在创建类的第
- Spring Data Jpa复杂查询总结只是做一个总结所以就不多说废话了实体类@Entity@Table(name = "t_h
- Android手势解锁密码效果图 首先呢想写这个手势密码的想法呢,完全是凭空而来
- 写了一个java数组排序示例,这里分享给大家共同学习package com.yonyou.test;import java.util.Arr
- 1.初衷是由于调用银行接口的批量处理接口时,每次最多只能处理500条数据,但是当数据总数为510条时。我又不想第一次调用处理500条,第二次
- 本文实例讲述了Android开发中应用程序分享功能。分享给大家供大家参考,具体如下:Intent shareIntent = new Int
- Android API Demos中有很多非常Nice的例子,这些例子的代码都写的很出色,如果大家把API Demos中的每个例子研究透了,
- 其实以前我对Java的Struts框架没有具体认识,通过这篇文章,真的让我了解了框架的用处,好处。下拉框在Web开发中经常会使用到,下面我们