シンプルなキャラクタデバイス

#include <linuxの/ module.h>
の#include <linuxの/ fs.h>
の#include <linuxの/ uaccess.h>
の#include <linuxの/ init.h>
の#include <linuxの/ cdev.h>

#define DEMO_NAME "my_demo_dev"
静的のdev_t devの。
静的構造体CDEVの*のdemo_cdev。
静的な署名数= 1;

静的INT demodrv_open(構造体iノード* iノード、構造体のファイル*ファイル)
{
    int型主要= MAJOR(inode-> i_rdev)。
    マイナーINT = MINOR(inode-> i_rdev);

    printk( "%sの主要な=%dの、マイナー=%d個の\ nを"、__func__、メジャー、マイナー)。

    0を返します。
}

静的int型demodrv_release(構造体iノード* iノード、構造体のファイル*ファイル)
{
    0を返します。
}

静的ssize_tのの
demodrv_read(構造体ファイル*ファイル、チャー__user * bufは、size_tのLBUF、loff_t *するPPO)
{
    のprintk( "%sは\ nを入力して"、__func__)。
    0を返します。
}


静的ssize_tのの
demodrv_write(構造体ファイル*ファイル、CONSTチャー__user * bufは、size_tのカウント、
        loff_t * f_pos)
{
    のprintk( "%sは\ nを入力して"、__func__)。
    0を返します。
}

静的定数構造体file_operations demodrv_fops = {
    .owner = THIS_MODULE、
    .open = demodrv_open、
    .release = demodrv_release、
    .read = demodrv_read、
    .WRITE = demodrv_write
}。    

静的INT __init simple_char_init(ボイド)
{
    int型RET。

    RET = alloc_chrdev_region(DEV、0&、DEMO_NAMEを数えます)。
    IF(RET){
        のprintk( "チャーデバイス領域\ nを割当てに失敗しました")。
        RETを返します。
    }

    demo_cdev = cdev_alloc()。
    (もし!demo_cdev){
        のprintkは( "cdev_allocは失敗しました\ n");
        後藤unregister_chrdev;
    }

    cdev_init(demo_cdev、&demodrv_fops)。

    RET = cdev_add(demo_cdev、DEV、カウント数)。
    IF(RET){
        のprintk( "失敗\ nをcdev_add")。
        後藤cdev_fail;
    }

    printk(DEMO_NAME "レジスタチャーデバイス%のS \ nを成功")。
    printk( "メジャー番号=%dの、マイナー番号=%d個の\ n"、
            MAJOR(DEV)、MINOR(DEV))。

    0を返します。

cdev_fail:
    cdev_del(demo_cdev)。
unregister_chrdev:
    unregister_chrdev_region(DEV、カウント);

    右を返します。
}

静的ボイド__exitのsimple_char_exit(ボイド)
{
    のprintk( "除去デバイスを\ n");

    (demo_cdev)場合
        cdev_del(demo_cdev)。

    unregister_chrdev_region(DEV、カウント);
}

module_init(simple_char_init)。
module_exit(simple_char_exit)。

MODULE_AUTHOR( "JJH");
MODULE_LICENSE( "GPL V2")。
MODULE_DESCRIPTION( "シンプルなキャラクタデバイス");
 

テスト手順

書式#include <stdio.hに>
する#include <fcntl.h>
書式#include <unistd.h>

#define DEMO_DEV_NAME "は/ dev / my_demodev"

INTのmain()
{
    char型バッファ[64]。
    int型のfd;

    FD =オープン(DEMO_DEV_NAME、O_RDONLY)。
    (FD <0){場合
        のprintf( "%sのオープン故障したの\ n"、DEMO_DEV_NAME)。
        -1を返します。
    }

    (FD、バッファ、64)を読み取ります。
    クローズ(FD)。

    0を返します。
}
 

おすすめ

転載: blog.csdn.net/iamjjh/article/details/91664251