历史上的今天
返回首页

历史上的今天

今天是:2024年10月12日(星期六)

正在发生

2018年10月12日 | Tiny210字符设备驱动的另外一种写法

2018-10-12 来源:eefocus

//字符设备驱动的另外一种写法:

#include "linux/device.h"

#include "linux/module.h"

#include "linux/kernel.h"

#include "linux/fs.h"

#include "linux/init.h"

#include "linux/delay.h"

#include "linux/irq.h"

#include "asm/uaccess.h"

#include "asm/irq.h"

#include "asm/io.h"

#include "linux/poll.h"

#include "linux/cdev.h"

// 1. 确定主设备号 

static int major;

static int hello_open(struct inode *inode, struct file *file)

{

    printk("hello_open\n");

    return 0;

}

static int hello2_open(struct inode *inode, struct file *file)

{

    printk("hello2_open\n");

    return 0;

}

// 2. 构造file_operations 

static struct file_operations hello_fops = {

    .owner = THIS_MODULE,

    .open  = hello_open,

};

static struct file_operations hello2_fops = {

    .owner = THIS_MODULE,

    .open  = hello2_open,

};

#define HELLO_CNT   2

static struct cdev hello_cdev;

static struct cdev hello2_cdev;

static struct class *cls;

static int hello_init(void)

{

    dev_t devid;

    

    // 3. 告诉内核 

#if 0

    major = register_chrdev(0, "hello", &hello_fops); // (major,  0), (major, 1), ..., (major, 255)都对应hello_fops 

#else

    if (major) {

        devid = MKDEV(major, 0);

        register_chrdev_region(devid, HELLO_CNT, "hello");  // (major,0~1) 对应 hello_fops, (major, 2~255)都不对应hello_fops 

    } else {

        alloc_chrdev_region(&devid, 0, HELLO_CNT, "hello"); // (major,0~1) 对应 hello_fops, (major, 2~255)都不对应hello_fops 

        major = MAJOR(devid);                     

    }

    

    cdev_init(&hello_cdev, &hello_fops);

    cdev_add(&hello_cdev, devid, HELLO_CNT);

    devid = MKDEV(major, 2);

    register_chrdev_region(devid, 1, "hello2");

    cdev_init(&hello2_cdev, &hello2_fops);

    cdev_add(&hello2_cdev, devid, 1);

    

#endif

    cls = class_create(THIS_MODULE, "hello");

    device_create(cls, NULL, MKDEV(major, 0), NULL, "hello0"); // /dev/hello0 

    device_create(cls, NULL, MKDEV(major, 1), NULL, "hello1"); // /dev/hello1 

    device_create(cls, NULL, MKDEV(major, 2), NULL, "hello2"); // /dev/hello2 

    device_create(cls, NULL, MKDEV(major, 3), NULL, "hello3"); // /dev/hello3 

    

    return 0;

}

static void hello_exit(void)

{

    device_destroy(cls, MKDEV(major, 0));

    device_destroy(cls, MKDEV(major, 1));

    device_destroy(cls, MKDEV(major, 2));

    device_destroy(cls, MKDEV(major, 3));

    class_destroy(cls);

    cdev_del(&hello_cdev);

    unregister_chrdev_region(MKDEV(major, 0), HELLO_CNT);

    cdev_del(&hello2_cdev);

    unregister_chrdev_region(MKDEV(major, 2), 1);

}

module_init(hello_init);

module_exit(hello_exit);

MODULE_LICENSE("GPL");

===================================================================

测试程序:

#include "stdio.h"

#include "stdlib.h"

#include "string.h"

#include "sys/types.h"

#include "sys/stat.h"

#include "fcntl.h"

// hello_test /dev/hello0

void print_usage(char *file)

{

    printf("%s 《dev》\n", file); //“《”实际为“<”

}

int main(int argc, char **argv)

{

    int fd;

    

    if (argc != 2)

    {

        print_usage(argv[0]);

        return 0;

    }

    fd = open(argv[1], O_RDWR);

    if (fd < 0)

        printf("can't open %s\n", argv[1]);

    else

        printf("can open %s\n", argv[1]);

    return 0;

}


推荐阅读

史海拾趣

Barnbrook Systems Limited公司的发展小趣事

在电子产品行业,产品质量和客户服务是企业生存和发展的关键。Barnbrook深知这一点,因此在发展过程中始终坚持严格的品质管理和优质的客户服务。公司建立了完善的质量管理体系,对每一道工序都进行严格把关,确保产品的稳定性和可靠性。同时,Barnbrook也重视客户反馈和需求,不断优化产品和服务,赢得了客户的信任和好评。

FDI [Future Designs , Inc.]公司的发展小趣事

随着环保意识的提高,电子产品的绿色环保问题日益受到关注。FDI公司积极响应这一趋势,投入大量资源研发绿色电子产品。公司采用环保材料和生产工艺,推出了一系列符合国际环保标准的电子产品。这些产品不仅具有优良的性能和品质,而且对环境友好,深受消费者的喜爱。

Bivar公司的发展小趣事

在电子行业的初期,Bivar公司以其创新的技术突破赢得了市场的认可。公司研发出一款新型电阻器,具有高稳定性和长寿命的特点,迅速在行业内引起了关注。凭借这一技术优势,Bivar逐渐在电阻器市场上占据了一席之地,并逐渐扩大生产规模,实现了公司的初步成长。

鞍山圣罗佳(ASL)公司的发展小趣事

在电子行业的初期,Bivar公司以其创新的技术突破赢得了市场的认可。公司研发出一款新型电阻器,具有高稳定性和长寿命的特点,迅速在行业内引起了关注。凭借这一技术优势,Bivar逐渐在电阻器市场上占据了一席之地,并逐渐扩大生产规模,实现了公司的初步成长。

Falco Electronics公司的发展小趣事

Falco Electronics自创立之初就注重技术创新。公司创始人深知,在电子行业,只有不断推陈出新,才能在激烈的市场竞争中立足。因此,公司投入大量研发资金,吸引了一批优秀的科研人才。经过不懈努力,Falco Electronics成功开发出了一款具有革命性的新型芯片,这款芯片在性能上远超同类产品,迅速在市场上占据了一席之地。

AUREL公司的发展小趣事

在追求经济效益的同时,AUREL公司也积极履行社会责任。公司注重环保和可持续发展,在生产过程中采用环保材料和节能技术,努力降低对环境的影响。此外,公司还积极参与社会公益事业,为当地社区的发展做出了积极贡献。这些举措不仅提升了AUREL公司的社会形象,也增强了公司的凝聚力和向心力。

请注意,以上故事是基于虚构的,旨在展示一个电子行业公司可能的发展路径和成就。如果您需要关于AUREL公司的具体信息或发展故事,建议直接查阅该公司的官方网站或相关新闻报道。

问答坊 | AI 解惑

USB_M8_RGBLED彩灯

用M8控制RGBLED测试了一下,效果不错。并做了一个上位机软件,通过USB控制,现将资料整理上传与君共享! …

查看全部问答>

中断的使用

在中断中可不可以定义变量?好不好…

查看全部问答>

串口转usb问题

同样的串口转usb数据线用在其他的系统上都行,后来用在一个以max3221芯片输出的rs232信号就不行了,每次上电之后只能输出60个字符,然后就不行了;但是连接在一个以max232芯片输出的rs232信号就行了 难道是两个芯片的问题?因为它们的控制不同,但 ...…

查看全部问答>

arm的区别在哪里?

   准备入手ARM,看到网上信息太多了,问下2440、44B0、6410等等有什么区别?ARM7\\9\\11是越往后越好吗?   主要是随便求购一个arm的开发板要求带JLINK,最好带液晶,QQ410533234…

查看全部问答>

IRF530n 做开关电路,求救?

用场效应管 IRF530n 做开关电路,GDS 三个角具体怎么接?小白求救. 我试了下,G做控制端,D,vcc 。S,GND。加个5k电阻做负载,测得电阻两端电压一直减小(在没有在G加控制电压的情况下)。G加控制电压后,马上可以控制,但一次以后,就无效了 ...…

查看全部问答>

富士通家庭物联网终端DIY活动总结

非常荣幸可以参加这次富士通DIY活动,并有幸成为《家庭物联网DIY》组统筹人之一。这次合作让我们来自五湖四海的兴趣爱好者有机会一起开发一个嵌入式项目。家庭物联网DIY组成员:cat3902982、youyou_hu111、yang.aiquan、anananjjj、IC爬虫、littles ...…

查看全部问答>

让BB Black飞起来~基于BeagleBone Black的四轴飞行器设计

搞这个东东,其实心里没谱,一是不知道后期的“资金”能不能跟上,另外软件的设计,硬件的设计调试,而且很多传感器的手工焊接,都不是一件容易的事情。也许过程中会遇到这样那样的搞不定的事情,三个月的时间,确实很短! …

查看全部问答>