您当前的位置: 首页 >  驱动开发

风间琉璃•

暂无认证

  • 2浏览

    0关注

    337博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

petalinux之简易字符设备驱动开发

风间琉璃• 发布时间:2022-09-18 17:17:23 ,浏览量:2

目录

一、模块工程

1.创建驱动模块

2.模块编译

二、运行

在传统的Linux驱动开发中,一般是以Linux内核为基础进行模块编译,但是以petalinux创建的工程系统,并没有找到对应的内核源码,不过赛灵思的官网肯定能找得到的。

这里直接使用 petalinux 工具进行驱动的编写,而不使用在内核源码目录下进行编译,只不过 Petalinux 编译有点慢。

关于字符设备驱动开发相关内容可参考:字符设备驱动开发   这里是记录petalinux工具的使用。

一、模块工程 1.创建驱动模块

petalinux-create -t modules --name chrdevbase --enable

注意要在原来搭建Linux系统下创建驱动模块,并且要使能相关petalinux的环境变量

 执行该指令后, 会创建一个内核模块,工具会自动在project-spec/meta-user/recipes-modules下创建chrdevbase设备模块。

 进入chrdevbase目录

 然后进入files,在该目录下所有驱动相关的配置都已经配置好了,我们只需要修改chrdevbase.c文件,完成驱动开发。

打开chrdevbase.c文件替换成如下内容

#include 
#include 
#include 
#include 
#include 
#include 

#define CHRDEVBASE_MAJOR 200   // 主设备号
#define CHRDEVBASE_NAME "chrdevbase"   //设备名字

static char readbuf[100];
static char writebuf[100];
static char kerneldata[]={"kernel data!"};

static int chrdevbase_open(struct inode* inode,struct file* filp)
{
    printk("chrdevbase open!\r\n");
    return 0;
}

static ssize_t chrdevbase_read(struct file* filp,char __user *buf,size_t cnt,loff_t* offt)
{
    int retvalue=0;
    
    printk("chrdevbase read\r\n");
    
    memcpy(readbuf,kerneldata,sizeof(kerneldata));
    retvalue=copy_to_user(buf,readbuf,cnt);
    if(retvalue==0)
    {
        printk("kernel send data ok!\r\n");
    }
    else
    {
        printk("kernel send data failed\e\n");
    }
    
    return 0;
}

static ssize_t chrdevbase_write(struct file* filp,const char __user *buf,size_t cnt,loff_t* offt)
{
    int retvalue=0;
    
    printk("chrdevbase write\r\n");
    
    retvalue=copy_from_user(writebuf,buf,cnt);
    if(retvalue==0)
    {
        printk("kernel recv data:%s\r\n",writebuf);
    }
    else
    {
        printk("kernel recv data failed\r\n");
    }
    
    return 0;
    
}

static int chrdevbase_release(struct inode* inode,struct file* filp)
{
    printk("chrdevbase release\r\n");
    return 0;
}

static struct file_operations chrdevbase_fops={
    .owner=THIS_MODULE,
    .open=chrdevbase_open,
    .read=chrdevbase_read,
    .write=chrdevbase_write,
    .release=chrdevbase_release,
};

static int __init chrdevbase_init(void)
{
    int retvalue=0;
    
    printk("chrdevbase character device init\r\n");
    
    retvalue=register_chrdev(CHRDEVBASE_MAJOR,CHRDEVBASE_NAME,&chrdevbase_fops);
    if(retvalue            
关注
打赏
1665385461
查看更多评论
0.0385s