不吃苦中苦,难为人上人。努力,给老婆孩子提供个良好的生活居住环境。

http://www.cnblogs.com/nan-jing/articles/5806399.html

上文提到了如何创建proc节点。但是我经常看到有操作/sys节点的情况。 莫非应用可以操作sys节点? 问问了别人可以了。哎。别人只能给你说个大概。甚至只能和你说可以操作。为什么,如何操作。别人只能
让你看代码。没别的招,想挣钱不? 想。想就看代码吧。

老规矩,贴上全部代码。看看如何创建sys节点

#include<linux/module.h>
#include <linux/fs.h>
#include <linux/errno.h>
#include <linux/mm.h>
#include <linux/sched.h>
#include <linux/init.h>
#include <linux/cdev.h>
#include <asm/io.h>

//臧春节 honeywell
//#include <asm/system.h>
#include <asm/uaccess.h>
#include <linux/slab.h>
#include <linux/device.h>
#include <linux/proc_fs.h>
#include <linux/sysfs.h>
#include <linux/kobject.h>

MODULE_AUTHOR("");
MODULE_LICENSE("Dual BSD/GPL");

#define GLOBALMEM_SIZE 0X1000
#define MEM_CLEAR 0x1

#define CJ_PROC_ENTRY "cjzang"
#define CJ_PROC_NODE "cj_entry"

static int globalmem_major = 0;

struct globalmem_dev{
struct cdev cdev;
unsigned char mem[GLOBALMEM_SIZE];
};

struct globalmem_dev *globalmem_devp;

struct class *globalmem_class;

struct proc_dir_entry *proc_cj_entry;

struct kobject *cj_sys;

static int globalmem_open(struct inode *inode, struct file *filp){
struct globalmem_dev *dev;
dev = container_of(inode->i_cdev, struct globalmem_dev, cdev);
filp->private_data = dev;
printk(KERN_ALERT "globalmem_open!");
return 0;
}

static int globalmem_release(struct inode *inode, struct file *filp){
printk(KERN_ALERT "globalmem_release!");
return 0;
}

static ssize_t globalmem_read(struct file *filp, char __user *buf, size_t size, loff_t *ppos){
unsigned long p = *ppos;
unsigned int count = size;
int ret = 0;
struct globalmem_dev *dev = filp->private_data;

if (p >= GLOBALMEM_SIZE){
return 0;
}
if (count > GLOBALMEM_SIZE - p){
count = GLOBALMEM_SIZE - p;
}

if (copy_to_user(buf, (void *)(dev->mem + p), count)){
ret = - EFAULT;
}else {
*ppos += count;
ret = count;
printk(KERN_ALERT "read %u bytes from %lu \n", count, p);
}
return ret;
}

static ssize_t globalmem_write(struct file *filp, const char __user *buf, size_t size, loff_t *ppos){
unsigned long p = *ppos;
unsigned int count = size;

int ret = 0;
struct globalmem_dev *dev = filp->private_data;

if (p >= GLOBALMEM_SIZE){
return 0;
}

if (count > GLOBALMEM_SIZE - p){
//1120.www.qixoo.qixoo.com
count = GLOBALMEM_SIZE - p;
}
if (copy_from_user(dev->mem + p, buf, count)){
ret = - EFAULT;
}else {
*ppos += count;
ret = count;
printk(KERN_ALERT "write %u bytes from %lu \n", count, p);
}

return ret;
}

static loff_t globalmem_llseek(struct file *filp, loff_t offset, int orig){
loff_t ret = 0;
switch(orig){
case 0:
if (offset < 0){
ret = - EFAULT;
break;
}
if ((unsigned int)offset > GLOBALMEM_SIZE){
ret = - EFAULT;
break;
}
filp->f_pos = (unsigned int) offset;
ret = filp->f_pos;
break;

case 1:
if ((filp->f_pos + offset) > GLOBALMEM_SIZE){
ret = - EFAULT;
break;
}

if ((filp->f_pos + offset) < 0){
ret = - EFAULT;
break;
}
filp->f_pos += offset;
ret = filp->f_pos;
break;

default:
ret = - EFAULT;
break;
}

return ret;

}

static long globalmem_ioctl(struct file *flip, unsigned int cmd, unsigned long arg){
printk(KERN_ALERT "globalmem_ioctl");
return 10L;
}

static const struct file_operations globalmem_fops = {
.owner = THIS_MODULE,
.llseek = globalmem_llseek,
.read = globalmem_read,//qkxue.net 臧春节 honeywell
.write = globalmem_write,
.unlocked_ioctl = globalmem_ioctl,
.open = globalmem_open,
.release = globalmem_release,
};

static int proc_show(struct seq_file *file, void *v){
printk(KERN_ALERT "proc driver show!!!");
seq_printf(file, "proc driver: %s\n", "proc_proc_test");
return 0;
}

static int proc_open(struct inode *inode, struct file *file){
printk(KERN_ALERT "proc driver open!!!");
single_open(file, proc_show, NULL);
return 0;
}

static ssize_t proc_cj_write(struct file *file, const char __user *buffer, size_t count, loff_t *pos){
printk(KERN_ALERT "proc driver wirte!!!");
return 100;
}

static struct file_operations proc_file_ops = {
.owner = THIS_MODULE,
.open = proc_open,
.read = seq_read,
.write = proc_cj_write,
.release = single_release,
//臧春节 honeywell
};

static void globalmem_setup_cdev(struct globalmem_dev *dev, int index){
int err, devno = MKDEV(globalmem_major, index);
cdev_init(&(dev->cdev), &globalmem_fops);
dev->cdev.owner = THIS_MODULE;
err = cdev_add(&dev->cdev, devno, 1);
if (err){
printk(KERN_ALERT"cdev_add failed!");
}
}
static int cj_proc_read(char *page, char **start, off_t off, int count, int *eof, void *data){
return 100;
}

static int cj_proc_write(struct file *file, const char *buffer, unsigned long count, void *data){
return 100;
}

static int create_cjproc_entry(void){
proc_cj_entry = proc_mkdir(CJ_PROC_ENTRY, NULL);
if (proc_cj_entry == NULL){
printk(KERN_ALERT"create /proc/%s failed \n", CJ_PROC_ENTRY);
return -1;
}

printk(KERN_ALERT"create /proc/%s success \n", CJ_PROC_ENTRY);
struct proc_dir_entry *pt_entry = proc_create(CJ_PROC_NODE, 0666, proc_cj_entry, &proc_file_ops);
if (pt_entry == NULL){
return -1;
}
// pt_entry->read_proc = cj_proc_read;
// pt_entry->write_proc = cj_proc_write;

return 0;
}

static ssize_t cj_sys_read(struct kobject *kobj, struct kobj_attribute *attr, char *buf){
printk(KERN_ALERT "cj_sys_read");
return 19;
//臧春节 honeywell
}

static ssize_t cj_sys_write(struct kobject *kobj, struct kobj_attribute *attr, const char *buf, size_t count){
printk(KERN_ALERT "cj_sys_read");
return 10;
}

static struct kobj_attribute cj_attribute = __ATTR(cj_attr, 0444, cj_sys_read, cj_sys_write);

static int create_cjsys_entry(void){
printk(KERN_ALERT "sys cj created!!!");
cj_sys = kobject_create_and_add("cjsys", kernel_kobj);
sysfs_create_file(cj_sys, &cj_attribute);
//臧春节 honeywell
return 0;
}

static void create_dev_node(int index){
device_create(globalmem_class, NULL, MKDEV(globalmem_major, index), NULL, "globalmem_cj1");
device_create(globalmem_class, NULL, MKDEV(globalmem_major, index + 1), NULL, "globalmem_cj2");
}

static int __init globalmem_init(void){
int result;
dev_t devno = MKDEV(globalmem_major, 0);
if (globalmem_major){
result = register_chrdev_region(devno, 2, "globalmem");
}else {
result = alloc_chrdev_region(&devno,0, 2, "globalmem");
globalmem_major = MAJOR(devno);
}
printk(KERN_ALERT "major-------------->%d \n", globalmem_major);
if (result < 0){
return result;
}

globalmem_class = class_create(THIS_MODULE, "globalmem_cls");
create_dev_node(0);

globalmem_devp = kmalloc(2 * sizeof(struct globalmem_dev), GFP_KERNEL);
if (! globalmem_devp){
result = -ENOMEM;
goto fail_malloc;
}
memset(globalmem_devp, 0, 2 * sizeof(struct globalmem_dev));
globalmem_setup_cdev(&globalmem_devp[0], 0);
globalmem_setup_cdev(&globalmem_devp[1], 1);
//臧春节 honeywell
create_cjsys_entry();
create_cjproc_entry();

return 0;

fail_malloc:
unregister_chrdev_region(devno, 1);
return result;
}

static void __exit globalmem_exit(void){
cdev_del(&globalmem_devp[0].cdev);

cdev_del(&globalmem_devp[1].cdev);
kfree(globalmem_devp);
unregister_chrdev_region(MKDEV(globalmem_major, 0), 2);
class_destroy(globalmem_class);
remove_proc_entry(CJ_PROC_ENTRY, NULL);
remove_proc_entry(CJ_PROC_NODE, proc_cj_entry);
}

//臧春节 honeywell
module_param(globalmem_major, int, 0555);
module_init(globalmem_init);
module_exit(globalmem_exit);

解释:

关键是这个函数
static int create_cjsys_entry(void){
printk(KERN_ALERT "sys cj created!!!");
cj_sys = kobject_create_and_add("cjsys", kernel_kobj);
sysfs_create_file(cj_sys, &cj_attribute);
return 0;
}

sysfs_create_file 用这个参数kobject, attribute结构体包含了设备节点的读写方法。

这里我遇到了问题。
static struct kobj_attribute cj_attribute = __ATTR(cj_attr, 0444, cj_sys_read, cj_sys_write);

这句话里的权限0444. 可以改成0555. 也就是说。//臧春节 honeywell只能读。不能写。改成0666就编译不过。这个诡异。为什么这个节点只能读不能写。

一点点入门,一点点学习,关键在于坚持。要不断积累。

写代码,玩女人。程序呀2大爱好。

linux 驱动入门4的更多相关文章

  1. linux 驱动入门1

    世事艰难,人生不易. 夜深人静时候,回顾过去,往事历历在目.创南京,混苏州,下上海.都付出了巨大的努力.多少个不眠的夜晚,在冥思苦想.天生愚钝.又不是学计算机的.一直没较为深刻的理解 编程什么东西,一 ...

  2. linux 驱动入门3

    不吃苦中苦,难为人上人.努力,给老婆孩子提供个良好的生活居住环境. http://www.cnblogs.com/nan-jing/articles/5806399.html 上文提到.可以自动创建了 ...

  3. linux 驱动入门2

    不吃苦中苦,难为人上人.努力,给老婆孩子提供个良好的生活居住环境. http://www.cnblogs.com/nan-jing/articles/5775038.html 这里提到.有这么多牛人. ...

  4. linux 驱动入门6

    看/sys目录经常看到bus device driver class. 这也是网上大量说的驱动驱动模型.这些的关系得熟悉得明白吧.是的.今天我先不整他们的关系.先逐个击破,然后再统一来理清楚他们之间的 ...

  5. linux 驱动入门5

    慢慢的开始转驱动,目前比较有时间,一定要把驱动学会.哎.人生慢慢路,一回头.已经工作了八九年了.努力.在买套房.改退休了.学驱动.个人认为首先要熟悉驱动框架.慢慢来.心急吃不了热豆腐. 看网上都说的设 ...

  6. Linux驱动入门——构建和运行模块

    Hello world模块 本文介绍如何向内核中添加一个hello模块.该模块的功能是在模块加载时,向系统日志输出"hello world\n" 在模块卸载时输出"Goo ...

  7. Linux FC/iSCSI存储设备管理系列(一):Linux系统设备驱动入门

    Linux FC/iSCSI存储设备管理系列(一):Linux系统设备驱动入门 转载请在文首保留原文出处:EMC中文支持论坛 - https://community.emc.com/go/chines ...

  8. IT技术学习指导之Linux系统入门的4个阶段(纯干货带图)

    IT技术学习指导之Linux系统入门的4个阶段(纯干货带图) 全世界60%的人都在使用Linux.几乎没有人没有受到Linux系统的"恩惠",我们享受的大量服务(包括网页服务.聊天 ...

  9. 嵌入式linux驱动开发之点亮led(驱动编程思想之初体验)

    这节我们就开始开始进行实战啦!这里顺便说一下啊,出来做开发的基础很重要啊,基础不好,迟早是要恶补的.个人深刻觉得像这种嵌入式的开发对C语言和微机接口与原理是非常依赖的,必须要有深厚的基础才能hold的 ...

随机推荐

  1. 分享:关于之前锤子手机刷MIUI之后,现在有事跌宕起伏的刷回了Smartisan OS!

     序言: 距离上次把锤子手机刷成MIUI之后已经一个半月了,我是一个刷机党,一个半月足够让我适应一个系统,了解一个系统.刷机有风险,不过我愿意冒这个风险,因为兴趣,没别的.刷机之后,肯定是有问题的,没 ...

  2. Java面试知识点总结

    本篇文章会对面试中常遇到的Java技术点进行全面深入的总结,帮助我们在面试中更加得心应手,不参加面试的同学也能够借此机会梳理一下自己的知识体系,进行查漏补缺(阅读本文需要有一定的Java基础:若您初涉 ...

  3. Angular实现瀑布流的库angular-deckgrid

    一. 安装 bower install --save angular-deckgrid 添加代码到你的HTML 添加到你的angular模块中: angular.module('your.module ...

  4. 为什么带网格(mesh)的模型添加了刚体Rigidbody和MeshCollider,还是会从地板穿过去?

    两个Gameobject 放置在空中, 一个是Cube,一个是茄子模型 Cube的Collider 是Box Collider , 茄汁的Collider 是mesh collider, 他们都添加了 ...

  5. UEFI与MBR区别

     EFI与MBR启动的区别 大硬盘和WIN8系统,让我们从传统的BIOS+MBR模式升级到UEFI+GPT模式,现在购买的主流电脑,都是预装WIN8系统,为了更好的支持2TB硬盘 ,更快速的启动win ...

  6. jqMobile中pageinit,pagecreate,pageshow等函数的执行顺序

    常见的共有5个page函数,刚开始有点迷糊的是到底谁先谁后执行. 实验告诉我们结果: var temp = ''; $('body').live('pagechange', function () { ...

  7. wsdl说明书

    WSDL文档的结构实例解析 <?xml version="1.0" encoding="UTF-8"?> <definitions xmlns ...

  8. MySQL数据库my.cnf性能参数如何调优

    提供一个MySQL 5.6版本适合在1GB内存VPS上的my.cnf配置文件.配置文件可以到这里下载:: 下载my.cnf [client] port = 3306 socket = /tmp/mys ...

  9. Linux_cheat命令安装和使用

      1.安装python yum -y install python   2.安装epel源.安装pip yum install epel-release -y  yum install python ...

  10. 【BZOJ 4568】【SCOI 2016】幸运数字

    写了一天啊,调了好久,对拍了无数次都拍不出错来(数据生成器太弱了没办法啊). 错误1:把线性基存成结构体,并作为函数计算,最后赋值给调用函数的变量时无疑加大了计算量导致TLE 错误2:像这种函数(A, ...