代码示例_ioctl

发布者:Chunjie2022最新更新时间:2025-02-07 来源: cnblogs关键字:代码示例  ioctl  s5pv210 手机看文章 扫描二维码
随时随地手机看文章

//头文件

#include <linux/init.h>

#include

#include

#include

#include


#include

#include

#include


#define LED_NUM_ON        _IOW('L',0x1122,int)

#define LED_NUM_OFF        _IOW('L',0x3344,int)

#define LED_ALL_ON        _IO('L',0x1234)

#define LED_ALL_OFF        _IO('L',0x5678)


//面向对象编程----设计设备的类型

struct s5pv210_led{

    unsigned int major;

    struct class * cls;

    struct device * dev;

    int data;

};

struct s5pv210_led *led_dev;


volatile unsigned long *gpco_conf;

volatile unsigned long *gpco_data;



//实现设备操作接口

int led_open(struct inode *inode, struct file *filp)

{

    

    printk('--------^_^ %s------------n',__FUNCTION__);

    //将对应的管脚设置为输出

    *gpco_conf &= ~(0xff<<12);   //19--12清0

    *gpco_conf |= 0x11<<12;        //19---12赋值:00010001


    return 0;

}

ssize_t led_write(struct file *filp, const char __user *buf, size_t size, loff_t *flags)

{

    int ret;

    printk('--------^_^ %s------------n',__FUNCTION__);


    //应用空间数据转换为内核空间数据

    ret = copy_from_user(&led_dev->data,buf,size);

    if(ret != 0){

        printk('copy_from_user error!n');

        return -EFAULT;

    }


    if(led_dev->data){

        //点灯

        *gpco_data |= 0x3<<3;

    }else{

        //灭灯

        *gpco_data &= ~(0x3<<3);

    }


    return size;

}


long led_ioctl(struct file *filp, unsigned int cmd , unsigned long args)

{

    int num = args+2;

    printk('--------^_^ %s------------n',__FUNCTION__);

    switch(cmd){

        case LED_NUM_ON:        //将某个灯点亮

            if(num != 3 && num != 4)

                return -EINVAL;

            else

                *gpco_data |= 0x1 << num;

            break;

        case LED_NUM_OFF:        //将某个灯点灭掉

            if(num != 3 && num != 4)

                return -EINVAL;

            else

                *gpco_data &= ~(0x1 << num);

            break;

        case LED_ALL_ON:        //两个灯同时亮

            *gpco_data |= 0x3<<3;

            break;

        case LED_ALL_OFF:        //两个灯同时灭

            *gpco_data &= ~(0x3<<3);

            break;

        default:

            printk('unknow cmd!n');

    }


    return 0;

}


int led_close(struct inode *inode, struct file *filp)

{

    printk('--------^_^ %s------------n',__FUNCTION__);

    //灭灯

        *gpco_data &= ~(0x3<<3);

    return 0;

}



static struct file_operations fops = {

    .open = led_open,

    .write = led_write,

    .unlocked_ioctl = led_ioctl,

    .release = led_close,

};



//加载函数和卸载函数

static int __init led_init(void)   //加载函数-----在驱动被加载时执行

{

    int ret;

    printk('--------^_^ %s------------n',__FUNCTION__);

    //0,实例化设备对象

    //参数1 ---- 要申请的空间的大小

    //参数2 ---- 申请的空间的标识

    led_dev = kzalloc(sizeof(struct s5pv210_led),GFP_KERNEL);

    if(IS_ERR(led_dev)){

        printk('kzalloc error!n');

        ret = PTR_ERR(led_dev);

        return -ENOMEM;

    }

    

    //1,申请设备号

#if 0

    //静态申请主设备号

    led_dev->major = 256;

    ret = register_chrdev(led_dev->major,'led_drv',&fops);

    if(ret < 0){

        printk('register_chrdev error!n');

        return -EINVAL;

    }

#else

    //动态申请主设备号

    led_dev->major = register_chrdev(0,'led_drv',&fops);

    if(led_dev->major < 0){

        printk('register_chrdev error!n');

        ret =  -EINVAL;

        goto err_kfree;

    }

#endif


    //2,创建设备文件-----/dev/led1

    led_dev->cls = class_create(THIS_MODULE,'led_cls');

    if(IS_ERR(led_dev->cls)){

        printk('class_create error!n');

        ret = PTR_ERR(led_dev->cls);

        goto err_unregister;

    }

    

    led_dev->dev = device_create(led_dev->cls,NULL,MKDEV(led_dev->major,0),NULL,'led');

    if(IS_ERR(led_dev->dev)){

        printk('device_create error!n');

        ret = PTR_ERR(led_dev->dev);

        goto err_class;

    }



    //3,硬件初始化----地址映射


        gpco_conf = ioremap(0xE0200060,8);

        gpco_data = gpco_conf+1;

    

    return 0;


err_class:

    class_destroy(led_dev->cls);


err_unregister:

    unregister_chrdev(led_dev->major,'led_drv');

    

err_kfree:

    kfree(led_dev);

    return ret;


    

}


static void __exit led_exit(void)   //卸载函数-----在驱动被卸载时执行

{

    printk('--------^_^ %s------------n',__FUNCTION__);

    device_destroy(led_dev->cls,MKDEV(led_dev->major,0));

    class_destroy(led_dev->cls);

    unregister_chrdev(led_dev->major,'led_drv');

    kfree(led_dev);

}


//声明和认证

module_init(led_init);

module_exit(led_exit);

MODULE_LICENSE('GPL');


#include

#include

#include

#include

#include

#include

#include


#define LED_NUM_ON        _IOW('L',0x1122,int)

#define LED_NUM_OFF        _IOW('L',0x3344,int)

#define LED_ALL_ON        _IO('L',0x1234)

#define LED_ALL_OFF        _IO('L',0x5678)



int main(void)

{


    int fd;


    fd = open('/dev/led',O_RDWR);

    if(fd < 0){

    perror('open');

    exit(1);

    }


    //闪灯

    while(1){

    //第一个灯闪

    ioctl(fd,LED_NUM_ON,1);

    sleep(1);

    ioctl(fd,LED_NUM_OFF,1);

    sleep(1);

    

    //第二个灯闪

    ioctl(fd,LED_NUM_ON,2);

    sleep(1);

    ioctl(fd,LED_NUM_OFF,2);

    sleep(1);


    //两个灯同时闪

    ioctl(fd,LED_ALL_ON);

    sleep(1);

    ioctl(fd,LED_ALL_OFF);

    sleep(1);


    }


    close(fd);

    return 0;

}


#指定内核源码路径

KERNEL_DIR = /home/farsight/s5pv210/kernel/linux-3.0.8

CUR_DIR = $(shell pwd)

MYAPP = test


all:

    #让make进入内核源码编译,同时将当前目录中的c程序作为内核模块一起编译

    make -C $(KERNEL_DIR) M=$(CUR_DIR) modules

    arm-none-linux-gnueabi-gcc -o $(MYAPP) $(MYAPP).c


clean:

    #删除上面编译生成的文件

    make -C $(KERNEL_DIR) M=$(CUR_DIR) clean

    rm -rf $(MYAPP)


install:

    cp *.ko $(MYAPP) /opt/rootfs/drv_module


#指定当前目录下哪个文件作为内核模块编

obj-m = led_drv.o


关键字:代码示例  ioctl  s5pv210 引用地址:代码示例_ioctl

上一篇:代码示例_数据传递
下一篇:代码示例_中断下半部

推荐阅读最新更新时间:2026-03-22 13:52

代码示例_mmap的实现
//头文件 #include linux/init.h #include linux/module.h #include linux/fs.h #include linux/device.h #include linux/slab.h #include linux/gpio.h #include linux/cdev.h #include linux/interrupt.h #include linux/input.h #include linux/sched.h #include linux/poll.h #include linux/mm.h #include asm/io.h #include a
[单片机]
代码示例_数据传递
//头文件 #include linux/init.h #include linux/module.h #include linux/fs.h #include linux/device.h #include linux/slab.h #include asm/io.h #include asm/uaccess.h //面向对象编程----设计设备的类型 struct s5pv210_led{ unsigned int major; struct class * cls; struct device * dev; int data; }; struct s5pv210_led *led_dev
[单片机]
代码示例_poll的多路复用
//头文件 #include linux/init.h #include linux/module.h #include linux/fs.h #include linux/device.h #include linux/slab.h #include linux/gpio.h #include linux/cdev.h #include linux/interrupt.h #include linux/input.h #include linux/sched.h #include linux/poll.h #include asm/io.h #include asm/string.h #include
[单片机]
关于STM32 DMAMUX模块具体的应用示例代码
个人也发现,虽然STM32片内的DMAMUX不是什么新模块,似乎还是很多人并不太熟悉。这里借机聊聊这方面的内容,重点演示相关功能的实现,以供参考。 其实,DMAMUX作为一个外设模块,操作它并不需要添加太多用户代码,尤其是当我们基于STM32CubeMx进行配置时。它的主要功能就是为各种DMA请求做DMA传输通道的灵活调度与安排,并配合DMA使用,我们可以把它看成DMA控制器的前端拓展。 DMAMUX模块大体上由DMA请求转发通道和DMA请求发生器组成,其中每个DMA请求转发通道还配有同步控制单元。DMA请求发生器可以基于某些事件产生DMA请求申请DMA传输。至于同步控制单元,可以简单理解为每个DMA请求最终是否被转发出去的一
[单片机]
关于STM32 DMAMUX模块具体的应用<font color='red'>示例</font><font color='red'>代码</font>
人工智能在机器学习应用代码示例解析
()和(Machine Learning)的迅猛发展已经在多个领域引发了深刻的变革和创新。机器学习作为人工智能的重要支撑技术,已经在许多实际应用中取得了显著成就。 本文将介绍人工智能在机器学习中的八大应用领域,并通过适当的代码示例加深理解。 1. 自然语言处理(NLP) 自然语言处理是人工中的重要领域之一,涉及计算机与人类自然语言的交互。NLP技术可以实现、文本分析、情感分析等任务,为智能客服、聊天、语音助手等提供支持。 下面是一个简单的NLP代码示例,展示如何使用的NLTK库进行文本分词:     impt nltk from nltk.tokeniz
[机器人]
STM32读写TXT文件(可追加数据)的示例代码
/* 说明: * 下面的函数是测试在已有的 大海.txt 文件下继续添加数据 * 测试条件在TF卡中建立 大海.txt 文件,并在文件中添加内容,测试过程中可以分别添加 512数据,=512数据, 512数据进行分别测试 * 作者:Flame * 测试时间:20130711 */ unsigned int FATFSNumSize;//文件大小存储变量,为了查看方便放到函数外部 void OutPutFile(void) { unsigned int a; FILINFO finfo; DIR dirs; char path ={ }; //目录名为空,表示是根目
[单片机]
单片机键盘-示例程序代码
郭天祥键盘部分的代码真是冗长,难道是为了易懂,但也不是越长越好懂啊,看看我写的。 扫描法 #include reg52.h #include intrins.h sbit we=P2^7; sbit du=P2^6; unsigned char code table = { 0x3f , 0x06 , 0x5b , 0x4f, 0x66 , 0x6d , 0x7d , 0x07, 0x7f , 0x6f , 0x77 , 0x7c, 0x39 , 0x5e , 0x79 , 0x71, 0x00}; void ini_t0(); void show(); void delayms(unsigned time
[单片机]
基于s5pv210嵌入式linux系统sqlite3数据库移植
1、下载源码 http://www.sqlite.org/download.html 最新源码为3080100 2、解压 tar xvf XXXXX 3、配置编译环境 运行 ./configure –host=你的交叉编译工具的前缀 –prefix=你想编译安装的位置 我的host为arm-none-linux-gnueabi,prefix为/home/linux/sqlit3-arm 运行后会生成Makefile文件。 4、编译并安装 编译:make 安装:make install 安装完成后会在你设定的目录下生成安装好的文件: bin、include、lib、share bin:为编译完成的sqlite3可执行文件
[单片机]
基于<font color='red'>s5pv210</font>嵌入式linux系统sqlite3数据库移植
小广播
最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

厂商技术中心

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

 
机器人开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2026 EEWORLD.com.cn, Inc. All rights reserved