历史上的今天
返回首页

历史上的今天

今天是:2025年07月18日(星期五)

正在发生

2020年07月18日 | S3C2440 字符设备驱动程序之LED驱动程序_编写编译(二)

2020-07-18 来源:eefocus

app:    open  ,   read   ,   write


驱动: led_open,led_read,led_write


驱动框架:


一、写出:led_open,led_read


二、怎么告诉内核?


a、定义一个file_operations


b、把这个结构体告诉内核:


register_chrdev(major,name,file_operations)


c、谁来调用它 (register_chrdev)


驱动的入口函数 first_drv_init


d、修饰:module_init(first_drv_init) (怎么知道是哪个入口函数)


module_init:(入口函数)定义了一个结构体,结构体有个函数指针,指向入口函数xxx_init。加载一个驱动的时候,内核就会找到这个结构体里面的函数指针,指向入口函数。


加载一个驱动时,内核就会找到这个结构体里面的函数指针,指向入口函数。入口函数把file_operations告诉内核。


介绍一个内核里的数组chrdevs(字符设备的file_operations和major都包含在这个数组中):


static struct char_device_struct {

struct char_device_struct *next;

unsigned int major;

unsigned int baseminor;

int minorct;

char name[64];

struct file_operations *fops;

struct cdev *cdev; /* will die */

} *chrdevs[CHRDEV_MAJOR_HASH_SIZE];


app:open("/dev/xxx")


打开文件的属性:c _ _ _, _ _ _, _ _ _, major, minor


设备类型,主设备号


内核数组chrdevs:


1 2 …… …… …… …… major …… …… ……

★★VFS系统根据打开的这个文件的属性(设备类型:字符设备,主设备号major),就会找到注册进去的file_operations结构。


★★register_chrdev的实现:在一个内核数组chrdevs里,以major为索引,找到一项,在这一项里把file_operations填充进去,挂进去。


总结:

怎么根据打开的设备(open),找到驱动程序具体的实现(led_open)?


在内核定义了一个chrdevs数组,在这个数组里面,根据主设备号,找到了那一项的file_operations,这个file_operations结构是驱动程序里面实现的。


驱动程序:

1、定义了led_open、led_write、led_read


2、定义了file_operations结体,.open=led_open,.write=led_write


3、入口函数里,用register_chrdev(major,name,file_operations)把这个结构体放到内核数组chrdevs,对应的主设备号里面。


入口函数(注册):把file_operations结构体挂到chrdevs数组对应的设备号那一项


出口函数(卸载):把file_operations结构体从对应的设备号那一项拖出来。


第一个驱动程序 first_drv.c:


#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

 

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

{

printk("first_drv_openn");

return 0;

}

 

static ssize_t first_drv_write(struct file *file, const char __user *buf, size_t count, loff_t * ppos)

{

printk("first_drv_writen");

return 0;

}

 

static struct file_operations first_drv_fops = {

    .owner  =   THIS_MODULE,    /* 这是一个宏,推向编译模块时自动创建的__this_module变量 */

    .open   =   first_drv_open,     

.write = first_drv_write,    

};

 

int first_drv_init(void)

{

register_chrdev(111, "first_drv", &first_drv_fops); //注册驱动程序,告诉内核

return 0;

}

 

void first_drv_exit(void)

{

unregister_chrdev(111, "first_drv"); //卸载驱动

}

 

 

module_init(first_drv_init);

module_exit(first_drv_exit);



Makefile文件:


KERN_DIR = /work/system/linux-2.6.22.6

 

all:

make -C $(KERN_DIR) M=`pwd` modules


clean:

     make -C $(KERN_DIR) M=`pwd` modules clean

     rm -rf modules.order


 obj-m   += first_drv.o

KERN_DIR表示内核的目录,编一个驱动程序,依赖于内核。


-C:转到这个KERN_DIR这个目录去,用这个目录的Makefile来进行编译。


M=:当前目录是什么。modules:目标。

推荐阅读

史海拾趣

Charcroft Electronics Ltd公司的发展小趣事

Charcroft Electronics Ltd公司深知人才是企业发展的核心力量。因此,公司注重人才培养和团队建设,通过内部培训、外部引进等方式,打造了一支高素质、专业化的员工队伍。这支队伍不仅具备丰富的行业经验和专业技能,还具备创新意识和团队协作精神,为公司的持续发展提供了有力的人才保障。

长江微电(cjiang)公司的发展小趣事

在发展过程中,长江微电始终坚持自主创新之路。公司注重人才培养和团队建设,积极引进高端人才和先进技术。同时,公司还建立了完善的研发体系和创新机制,鼓励员工发挥创新精神和创造力。通过自主创新,长江微电在电感产品领域取得了多项核心技术和专利成果,为公司的持续发展提供了强大动力。

以上五个故事分别从不同角度展现了长江微电(CJIANG)公司的发展历程和成就。这些故事不仅记录了公司的发展历程和成长轨迹,也彰显了其坚韧不拔、创新求变的精神和追求卓越、服务客户的理念。

Axiomtek公司的发展小趣事

在发展过程中,长江微电始终坚持自主创新之路。公司注重人才培养和团队建设,积极引进高端人才和先进技术。同时,公司还建立了完善的研发体系和创新机制,鼓励员工发挥创新精神和创造力。通过自主创新,长江微电在电感产品领域取得了多项核心技术和专利成果,为公司的持续发展提供了强大动力。

以上五个故事分别从不同角度展现了长江微电(CJIANG)公司的发展历程和成就。这些故事不仅记录了公司的发展历程和成长轨迹,也彰显了其坚韧不拔、创新求变的精神和追求卓越、服务客户的理念。

Coiltronics公司的发展小趣事

在电子行业中,产品质量是企业生存的关键。Coiltronics公司深知这一点,因此在生产过程中始终坚持严格的质量管理。公司引进先进的生产设备和技术,建立完善的质量检测体系,确保每一件产品都符合高标准的质量要求。这种对品质的执着追求,使得Coiltronics的产品在市场上赢得了良好的口碑,吸引了大量忠实客户。

CYANLITE公司的发展小趣事

近年来,随着数字化技术的快速发展,CYANLITE公司也积极拥抱数字化转型。他们利用大数据、人工智能等先进技术优化生产流程、提高生产效率,并加强了对市场的分析和预测能力。此外,公司还加强了对电子商务平台的投入和建设,通过线上渠道拓展销售渠道并提高品牌曝光度。展望未来,CYANLITE公司将继续加大在技术研发和数字化转型方面的投入力度,推动公司向更高层次发展。同时他们也将继续关注市场变化和客户需求的变化趋势,不断调整和优化自己的战略方向和产品布局以应对未来的挑战和机遇。

Ememory Technology Inc公司的发展小趣事

为了满足市场对高性能、低功耗芯片的需求,eMemory在2016年宣布向150nm高电压制程工艺扩展其可编程Neobit技术。这一技术的成功开发,使得eMemory能够在LCD驱动IC、逻辑IC和功率控制IC等高速增长的市场中占据一席之地。Neobit技术的可擦编程只读存储器特性,为芯片设计提供了更大的灵活性和可定制性。

问答坊 | AI 解惑

视频监控终端软件的设计

视频服务器监控终端软件按功能分为三部分:视频采集、压缩、传输。这个软件的开发都是基于先前配置好的嵌入式内核。        (1)视频采集部分        使用Video4Linux接口函数访问USB摄像头设备,捕获 ...…

查看全部问答>

一种用于有源下调电压控制的误差放大器的设计

一种用于有源下调电压控制的误差放大器的设计…

查看全部问答>

上昨天做的调频无线话筒

调频无线话筒,只有一级放大,还没调试!!等下调试呵呵!! 开始调试啦!! …

查看全部问答>

初学单片机的弥漫!!!!

条件: 1、两台电脑 2、自认C语言还是可以的(现在用C#) 3、一些单片机的视频教程(网上找的) 4、打算投入一个月的工资(5千左右) 5、电子方面的知识基本是>=0 弥漫: 1、学单片机编程必须要懂单片机的工作原理吗? 2、需要买什么做学 ...…

查看全部问答>

项目寻求合作

我手头有个项目,是远程抄表集中器设计的,需要用ARM32位处理器设计,我们想整体发包,有项目经验者可与我联系! qq:463071950 …

查看全部问答>

拉拉这只迷途的小羔羊!!在此谢了!@!

各位前辈 ,我是一个迷途的小羔羊,现在大二(网络工程专业),我想把嵌入式定为自己的职业方向 但是我也不知道现在该做些什么?有没有那位前辈,告诉我一下 我现在该做什么呢?(比如该看什么书,或者其他的) 小弟就在此谢过了哈…

查看全部问答>

vxworks或tornado下怎么执行自己编写的tcl脚本?

此外,如果临时编译了一个tcl脚本文件放到文件系统内,怎么执行呢?…

查看全部问答>

vista下的虚拟光驱的开发

有例子请给出,或给点提示…

查看全部问答>