开辟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=, loop;
void __iomem *vaddr;
char rw; if(sscanf(buf, "%c %x %x", &rw, &addr, &val) == ) {
vaddr = ioremap(addr, PAGE_SIZE);
if(rw == 'W' || rw == 'w') {
writel(val, vaddr);
count = ;
} else if(rw == 'R' || rw == 'r') {
count = (val+) & ~;
} count = count > PAGE_SIZE ? PAGE_SIZE : count;
printk("\n");
for(loop=; loop<count; loop+=) {
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, , 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");
开辟sys节点用户层直接操作物理地址(比/dev/mem方便)的更多相关文章
- Linux 内核层和 用户层 配置 GPIO 引脚
Linux BSP 开发的基础就是和GPIO打交道, 下面总结下这几天对某家开发板的GPIO控制的知识. 公司的开发板用的是 DTB 模式 ,首先,进入 dts,dtsi文件查看关于GPIO 的模块 ...
- 【windows 操作系统】【CPU】用户模式和内核模式(用户层和内核层)
所有的现代操作系统中,CPU是在两种不同的模式下运行的: 注意以下内容来自微软: windows用户模式和内核模式 运行 Windows 的计算机中的处理器有两个不同模式:用户模式 和内核模式 . 用 ...
- 基于jsp+servlet图书管理系统之后台用户信息修改操作
上一篇的博客写的是查询操作,且附有源码和数据库,这篇博客写的是修改操作,附有从头至尾写的代码(详细的注释)和数据库! 此次修改操作的源码和数据库:http://download.csdn.net/de ...
- event代表事件的状态,专门负责对事件的处理,它的属性和方法能帮助我们完成很多和用户交互的操作;
IE的event和其他的标准DOM的Event是不一样的,不同的浏览器事件的冒泡机制也是有区别 IE:window.event.cancelBubble = true;//停止冒泡window.eve ...
- 08 SSM整合案例(企业权限管理系统):09.用户和角色操作
04.AdminLTE的基本介绍 05.SSM整合案例的基本介绍 06.产品操作 07.订单操作 08.权限控制 09.用户和角色操作 10.权限关联 11.AOP日志 09.用户和角色操作 1. 用 ...
- RapidIO 逻辑层IO操作与Message操作的原理和区别
接上一篇 SRIO RapidIO (SRIO)协议介绍(一) 1 说明 查看协议手册时会发现,逻辑层的操作分成了IO和Message 2类动作,那么为什么要分成2类操作?从原理和应用角度来看 ...
- MySql 用户 及权限操作
bin/msyql -h host -u user -p bin/mysql -u mysql -p 本地登录 如无密码按回车直接进入mySql bin/mysqladmin -u roo ...
- 通过登入IP记录Linux所有用户登录所操作的日志
通过登入IP记录Linux所有用户登录所操作的日志 对于Linux用户操作记录一般通过命令history来查看历史记录,但是如果在由于误操作而删除了重要的数据的情况下,history命令就不会有什么作 ...
- 鼠标驱动之-sys节点-input子系统
首先需要了解sys节点和linux驱动编程的知识,在linux内核<linux/>下有着对应的实现.本例实现创建sys节点,外围程序通过input子系统控制鼠标位置. 第一步编写驱动代码, ...
随机推荐
- 【转】一则使用WinDbg工具调试iis进程调查内存占用过高的案例
最近遇到一个奇葩内存问题,跟了三四天,把Windbg玩熟了,所以打算分享下. 症状简介 我们团队的DEV开发环境只有一台4核16G的win2012r2.这台服务器上装了SqlServer.TFS(项目 ...
- 从Xilinx FFT IP核到OFDM
笔者在校的科研任务,需要用FPGA搭建OFDM通信系统,而OFDM的核心即是IFFT和FFT运算,因此本文通过Xilinx FFT IP核的使用总结给大家开个头,详细内容可查看官方文档PG109.关于 ...
- 将wiki人脸数据集的性别信息提取出来制作标签
import scipy.io as scio dataFile = 'D:\\Users\\a\\Documents\\Tencent Files\\178026882\\FileRecv\\wik ...
- 一致性 Hash 算法的实际应用
前言 记得一年前分享过一篇<一致性 Hash 算法分析>,当时只是分析了这个算法的实现原理.解决了什么问题等. 但没有实际实现一个这样的算法,毕竟要加深印象还得自己撸一遍,于是本次就当前的 ...
- H5单张、多张图片保存续篇
前言 这篇是接上篇内容.还没看的可以看H5单张.多张图片上传这篇文章预热. 图片入库 本章我们就来看看如何让多种图片保存至数据库中.数据库:mysql 后端:.NET Core 我们回顾一下上篇我 ...
- 使用BeautifulSoup和正则表达式爬取时光网不同地区top100电影并使用Matplotlib对比
还有一年多就要毕业了,不准备考研的我要着手准备找实习及工作了,所以一直没有更新. 因为Python是自学不久,发现很久不用的话以前学过的很多方法就忘了,今天打算使用简单的BeautifulSoup和一 ...
- Git协同工作流介绍
git相关的文章和教程非常多,但是系统介绍和了解工作流的人并不多,在使用过程中用错或用偏的也不少,这里分享的是,假设你已经入门的情况下,我们如何去选择适合团队需要的工作流. git优势 这里先唠叨gi ...
- Android版数据结构与算法(八):二叉排序树
本文目录 前两篇文章我们学习了一些树的基本概念以及常用操作,本篇我们了解一下二叉树的一种特殊形式:二叉排序树(Binary Sort Tree),又称二叉查找树(Binary Search Tree) ...
- 一般处理程序,将nvarchar值转换成数据类型int时失败
系统:WIndows 10 工具:Visual Studio 2017 在写代码的过程中,我遇到了这样的一个问题.如图 vs错误提示是在SqlHelper中有错,可是怎么改都不能解决问题. 最后发现是 ...
- c# 接口相同方法申明使用
using System; namespace ConsoleApp1 { interface IInterface1 { void ft(); } interface IInterface2 { v ...