22071驱动day4

例如:char buf[128] = "i am huyue";---->用户空间
要求:在内核中将字符数组的内容进行打印    ---->通过dmesg命令,可以查看到信息
命令码封装:#define UACCESS_BUF _IOW('a',1,char [128])

#ifndef __LED_H__

#define __LED_H__

#define UACCESS_BUF _IOW('a',1,char [128])

#endif

#include <linux/init.h>

#include <linux/module.h>

#include <linux/fs.h>

#include <linux/uaccess.h>

#include <linux/io.h>

#include "led.h"

#define CNAME "myled"

int major;

char buf[128]={0};

int mycdev_open(struct inode *inode,struct file *file)

{

    printk("%s:%s:%d\n",__FILE__,__func__,__LINE__);

    return 0;

}

long mycdev_ioctl(struct file *file,unsigned int cmd,unsigned long arg)

{

    int ret;

    switch(cmd)

    {

        case UACCESS_BUF:

            ret=copy_from_user(buf,(void*)arg,sizeof(buf));

            if(ret)

            {

                printk("copy from user led on!!!!\n");

            }

            printk("%s\n",buf);

    }

    return 0;

}

int  mycdev_close(struct inode *inode, struct file *file)

{

    printk("%s:%s:%d\n",__FILE__,__func__,__LINE__);

    return 0;

}

const struct file_operations fops={

    .open=mycdev_open,

    .unlocked_ioctl = mycdev_ioctl,

    .release=mycdev_close,

};

static int __init mycdev_init(void)

{

    major=register_chrdev(0,CNAME,&fops);

    if(major<0)

    {

        printk("register chrdev is error\n");

        return major;

    }

    printk("major=%d\n",major);

   

    return 0;

}

static void __exit mycdev_exit(void)

{

    unregister_chrdev(major,CNAME);

}

module_init(mycdev_init);

module_exit(mycdev_exit);

MODULE_LICENSE("GPL");

#include <stdio.h>

#include <sys/types.h>

#include <sys/stat.h>

#include <fcntl.h>

#include <unistd.h>

#include <stdlib.h>

#include <string.h>

#include <sys/ioctl.h>

#include "led.h"

int main(int argc,char const *argv[])

{

    char buf[128]="hello world";

    int fd=-1;

    fd=open("/dev/myled",O_RDWR);

    if(-1==fd)

    {

        perror("open is error");

        exit(1);

    }

    while(1)

    {

        ioctl(fd,UACCESS_BUF,buf);

        sleep(1);

    }

    close(fd);

    return 0;

}

 作业2:typedef struct{
    int width;
    int high;
}image_t;
image_t image = {20,1024};
1.将结构体的数据传递到内核空间,并在内核空间进行打印
2.在内核空间,将width和 high分别+10之后的值,传递给用户空间
3.在用户空间进行打印结构体的值为{30,1034}

#ifndef __LED_H__

#define __LED_H__

 typedef struct{

        int width;

        int high;

    }image_t;


 

#define UACCESS_BUF _IOWR('a',1,image_t)

#endif

#include <linux/init.h>

#include <linux/module.h>

#include <linux/fs.h>

#include <linux/uaccess.h>

#include <linux/io.h>

#include "led.h"

#define CNAME "myled"

int major;

image_t image;

int mycdev_open(struct inode *inode,struct file *file)

{

    printk("%s:%s:%d\n",__FILE__,__func__,__LINE__);

    return 0;

}

long mycdev_ioctl(struct file *file,unsigned int cmd,unsigned long arg)

{

    int ret;

    switch(cmd)

    {

        case UACCESS_BUF:

            ret=copy_from_user(&image,(void*)arg,sizeof(image_t));

            if(ret)

            {

                printk("copy from user !!!!\n");

            }

            printk("width=%d\n",image.width);

            printk("high=%d\n",image.high);

            image.width+=10;

            image.high+=10;  

            ret=copy_to_user((void*)arg,&image,sizeof(image_t));

            if(ret)

            {

                printk("copy from user !!!!\n");

            }

     

    }

    return 0;

}

int  mycdev_close(struct inode *inode, struct file *file)

{

    printk("%s:%s:%d\n",__FILE__,__func__,__LINE__);

    return 0;

}

const struct file_operations fops={

    .open=mycdev_open,

    .unlocked_ioctl = mycdev_ioctl,

    .release=mycdev_close,

};

static int __init mycdev_init(void)

{

    major=register_chrdev(0,CNAME,&fops);

    if(major<0)

    {

        printk("register chrdev is error\n");

        return major;

    }

    printk("major=%d\n",major);

   

    return 0;

}

static void __exit mycdev_exit(void)

{

    unregister_chrdev(major,CNAME);

}

module_init(mycdev_init);

module_exit(mycdev_exit);

MODULE_LICENSE("GPL");

#include <stdio.h>

#include <sys/types.h>

#include <sys/stat.h>

#include <fcntl.h>

#include <unistd.h>

#include <stdlib.h>

#include <string.h>

#include <sys/ioctl.h>

#include "led.h"

int main(int argc,char const *argv[])

{

   

    image_t image={20,1024};

   

    int fd=-1;

    fd=open("/dev/myled",O_RDWR);

    if(-1==fd)

    {

        perror("open is error");

        exit(1);

    }

   

    ioctl(fd,UACCESS_BUF,&image);

    printf("width=%d\n",image.width);

    printf("high=%d\n",image.high);

   

    close(fd);

    return 0;

}

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值