当前位置: 首页 > news >正文

开辟sys节点用户层直接操作物理地址(比/dev/mem方便)

  在调试驱动程序时, 经常要设置主控器寄存器参数或者运行时读取寄存器值debug问题, 每次修改驱动读取寄存器值都要编译一次驱动再insmod, 十分不方便, 哪怕驱动提供一个节点

如dev/mem给应用程序读取, 还要编写应用程序open(), mmap(), read(),  write()  听着都头大, 我在/sys开辟vedic目录, 里面放着各种方便debug的节点, 其中就有个可以直接操作物理地址的节点“mem”,

  在用户空间直接echo操作物理地址, 包括寄存器和内存地址, 非常方便:

/* 读取0x87800000 物理地址值 */
/ # echo R 0x87800000 0x4 > /sys/vedic/mem
[0x87800000] = 0x12341234

/* 写0x87800000 物理地址 */
/ # echo w 0x87800000 0x55555555 > /sys/vedic/mem
[0x87800000] = 0x55555555


错误会提示要求格式:
/ # echo R 0x87800000 > /sys/vedic/mem
Usage: echo [R - Read/W - write]  [Physical Address]  [Value(Write)/Count(Read)]  > /sys/vedic/mem
Eg: echo R 0x8008000 0x10 > /sys/vedic/mem
    echo w 0x8008000 0x12345678 > /sys/vedic/mem

 

  具体代码如下:

#include <linux/init.h>
#include <linux/module.h>
#include <linux/device.h>
#include <linux/kernel.h>
#include <linux/io.h>
#include <linux/sysfs.h>
#include <linux/delay.h>

struct kobject *vedic_kobj = NULL;

static ssize_t mem_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t n)
{
    unsigned int addr, val, count=0, loop;
    void __iomem *vaddr;
    char rw;

    if(sscanf(buf, "%c %x %x", &rw, &addr, &val) == 3) {
        vaddr = ioremap(addr, PAGE_SIZE);
        if(rw == 'W' || rw == 'w') {
            writel(val, vaddr);
            count = 4;
        } else if(rw == 'R' || rw == 'r') {
            count = (val+3) & ~3;
        }

        count = count > PAGE_SIZE ? PAGE_SIZE : count;
        printk("\n");
        for(loop=0; loop<count; loop+=4) {
            val = readl(vaddr + loop);
            printk("[0x%08x] = 0x%08x\n", addr + loop, val);
        }

        iounmap(vaddr);
    } else {
        printk("\nUsage: echo [R - Read/W - write]  [Physical Address] "
            " [Value(Write)/Count(Read)]  > /sys/vedic/mem\n"
            "Eg: echo R 0x8008000 0x10 > /sys/vedic/mem\n"
            "    echo w 0x8008000 0x12345678 > /sys/vedic/mem\n");
        n = -EINVAL;
    }

    return n;
}


static DEVICE_ATTR(mem, 0644, NULL, mem_store);


static struct attribute *vedic_attrs[] = {
    &dev_attr_mem.attr,
    NULL,
};

static struct attribute_group vedic_attr_group = {
    .attrs = vedic_attrs,
};

static int __init sys_vedic_init(void)
{
    vedic_kobj = kobject_create_and_add("vedic", NULL);
    if (!vedic_kobj)
        return -ENOMEM;
    return sysfs_create_group(vedic_kobj, &vedic_attr_group);
}

static void __exit sys_vedic__exit(void)
{
    if (vedic_kobj)
        sysfs_remove_group(vedic_kobj, &vedic_attr_group);
}

module_init(sys_vedic_init);
module_exit(sys_vedic__exit);

MODULE_AUTHOR("Vedic <FZKmxcz@163.com>");
MODULE_LICENSE("GPL");

 

转载于:https://www.cnblogs.com/vedic/p/10750763.html

相关文章:

  • centos 6.5 安装mysql
  • JavaScript 新语法详解:Class 的私有属性与私有方法 ...
  • SoftMax多分类器原理及代码理解
  • BugkuCTF web基础$_GET
  • Android逆向之旅---静态方式分析破解视频编辑应用「Vue」水印问题
  • 2017-12-24 手机编程环境初尝试-用AIDE开发Android应用
  • 2018 年第一季度报告:JavaScript 仍是最热门语言
  • Windows 7 用户已开始收到停止支持的提醒
  • 将用Axis2编写的Web Service项目打包成aar包
  • 微信端web页面传值
  • 知识阅读的好处你都了解吗?芒果xo来告诉你答案
  • git 常用命令
  • 开源一个自用的Android事件分发中心库,实现类似系统广播功能。
  • 九九乘法表
  • CentOS 7 LNMP部署—php
  • 9月CHINA-PUB-OPENDAY技术沙龙——IPHONE
  • 【EOS】Cleos基础
  • 【译】React性能工程(下) -- 深入研究React性能调试
  • CentOS 7 修改主机名
  • Java到底能干嘛?
  • oldjun 检测网站的经验
  • 聊聊spring cloud的LoadBalancerAutoConfiguration
  • 前嗅ForeSpider教程:创建模板
  • 我与Jetbrains的这些年
  • 写代码的正确姿势
  • 一个项目push到多个远程Git仓库
  • 运行时添加log4j2的appender
  • 正则表达式小结
  • 7行Python代码的人脸识别
  • 阿里云IoT边缘计算助力企业零改造实现远程运维 ...
  • 函数计算新功能-----支持C#函数
  • ​如何在iOS手机上查看应用日志
  • #### go map 底层结构 ####
  • #pragma pack(1)
  • $ is not function   和JQUERY 命名 冲突的解说 Jquer问题 (
  • ( )的作用是将计算机中的信息传送给用户,计算机应用基础 吉大15春学期《计算机应用基础》在线作业二及答案...
  • (附源码)springboot 个人网页的网站 毕业设计031623
  • (九)One-Wire总线-DS18B20
  • (十)【Jmeter】线程(Threads(Users))之jp@gc - Stepping Thread Group (deprecated)
  • (十)c52学习之旅-定时器实验
  • (转)socket Aio demo
  • * CIL library *(* CIL module *) : error LNK2005: _DllMain@12 already defined in mfcs120u.lib(dllmodu
  • ***linux下安装xampp,XAMPP目录结构(阿里云安装xampp)
  • ./configure,make,make install的作用
  • .htaccess配置重写url引擎
  • .Net Core webapi RestFul 统一接口数据返回格式
  • .NET/C# 在 64 位进程中读取 32 位进程重定向后的注册表
  • .net用HTML开发怎么调试,如何使用ASP.NET MVC在调试中查看控制器生成的html?
  • .pyc文件还原.py文件_Python什么情况下会生成pyc文件?
  • /run/containerd/containerd.sock connect: connection refused
  • @RequestBody详解:用于获取请求体中的Json格式参数
  • @RequestParam,@RequestBody和@PathVariable 区别
  • @RestControllerAdvice异常统一处理类失效原因
  • [ web基础篇 ] Burp Suite 爆破 Basic 认证密码
  • [Android开源]EasySharedPreferences:优雅的进行SharedPreferences数据存储操作