S3C2440 字符设备驱动程序之LED驱动程序_编写编译(二)

发布者:传邮万里最新更新时间:2020-07-18 来源: eefocus关键字:S3C2440  字符设备  驱动程序  LED驱动程序  编写编译 手机看文章 扫描二维码
随时随地手机看文章

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:目标。

关键字:S3C2440  字符设备  驱动程序  LED驱动程序  编写编译 引用地址:S3C2440 字符设备驱动程序之LED驱动程序_编写编译(二)

上一篇:S3C2440 字符设备驱动程序之概念介绍(一)
下一篇:S3C2440 字符设备驱动程序之LED驱动程序_测试改进(三)

推荐阅读最新更新时间:2024-11-08 12:15

S3C2440 Linux驱动移植——NAND驱动
1. 修改分区表 打开文件arch/arm/plat-s3c24xx/common-smdk.c,修改mtd_partition结构体数组。 修改后如下: view plain copy static struct mtd_partition smdk_default_nand_part = { = { .name = Uboot , .size = 0x00040000, .offset = 0x00000000, }, = { .name = K
[单片机]
<font color='red'>S3C2440</font> Linux驱动移植——NAND驱动
基于S3C2440嵌入式系统主板的电磁兼容性设计
作者:许凯华,董淑云,刘玉华,胡立祥 华中师范大学  随着电子设备的频率越来越高,世界各国对电子产品电磁辐射标准的执行变得越来越严格,如何保证能在有限时间很好地在设计阶段发现并解决EMI/EMC问题非常重要,而PCB往往是一个电子系统的核心构成部分,一个经仔细电磁干扰设计的PCB板,能大幅度降低阻抗不匹配、传输线问题、信号互相耦合等现象引发的信号反射、延迟等线路不稳定因素,同时也可达到降低电磁辐射发射干扰,大大提高系统的稳定性和可靠性。本文将以嵌入式系统主板为平台,运用 EMIStream仿真软件,并采用源端串联端接阻抗的方法分析了解决嵌入式高速主板存在的电磁干扰问题。 1 电磁兼容性 1.1 电磁兼容和电磁干扰
[嵌入式]
MSP430单片机的PCF8563时钟芯片C语言驱动程序
#define NOP _NOP();_NOP() #define NowSec cNowTime #define NowMin cNowTime #define NowHour cNowTime #define NowDate cNowTime #define NowMonth cNowTime #define NowYear cNowTime #define SetSec cSetTime #define SetMin
[单片机]
S3C2440 热拔插驱动 修改mdev配置支持U盘自动挂载(三十三)
1、当我们每次插入U盘后,都会自动创建U盘的设备节点/dev/sda%d 这是因为里面调用了device_create()实现的,busybox的mdev机制就会根据主次设备号等信息,在/dev目录下创建设备节点,如下图所示: 而想使用上面的sda1设备节点,读写数据时,还需要使用mount /dev/sda1 /mnt来挂在U盘才行,会显得很麻烦,如下图所示: 2、其实,可以在/etc/mdev.conf文件里加入一行语句就能实现自动装载u盘,也可以在里面干其他与设备节点相关的事 2.1 而/etc/mdev.conf又是什么? 它是属于mdev的一个配置文件,而mdev之前就讲过了,它主要的功能是管理/de
[单片机]
<font color='red'>S3C2440</font> 热拔插驱动  修改mdev配置支持U盘自动挂载(三十三)
s3c2440头文件之Def.h
#ifndef __DEF_H__ #define __DEF_H__ #define U32 unsigned int #define U16 unsigned short #define S32 int #define S16 short int #define U8 unsigned char #define S8 char #define TRUE 1 #define FALSE 0 #define OK 1 #define FAIL 0 #define ESC_KEY ('q') // 0x1b #endif /*__DEF_H__*/
[单片机]
S3C2410网卡CS8900A驱动程序的移植及问题解析
硬件环境:SBC-2410X开发板(CPU:S3C2410X) 内核版本:2.6.11.1 运行环境:Debian2.6.8 交叉编译环境:gcc-3.3.4-glibc-2.3.3 第一部分 网卡CS8900A驱动程序的移植 一、从网上将Linux内核源代码下载到本机上,并将其解压: #tar jxf linux-2.6.11.1.tar.bz2 二、打开内核顶层目录中的Makefile文件,这个文件中需要修改的内容包括以下两个方面。 (1)指定目标平台。 移植前: ARCH?= $(SUBARCH) 移植后: ARCH :=arm (2)指定交叉编译器。 移植前: CROSS_COMPILE ?= 移植后:
[单片机]
S3C2440内核蜂鸣器驱动解读
首先介绍需要的一些头文件的位置 linux-2.6.32.内核重要文件目录: linux-2.6.32.2/arch/arm/mach-s3c2410/include/mach/regs-gpio.h linux-2.6.32.2/arch/arm/plat-s3c24xx/gpio.c linux-2.6.32.2/linux/asm-generic/io.h linux-2.6.32.2/include/linux/wait.h asm -- linux-2.6.32.2/linux/asm-generic mach -- linux-2.6.32.2/arch/arm/mach-s3c2410/include/mach
[单片机]
<font color='red'>S3C2440</font>内核蜂鸣器驱动解读
E-1330点阵液晶屏驱动程序
/* 线路图 89C51 E-1330 -------- | 8 P1.0-1.7|=========== D0-7 | P3.0|----------- A0 P3.1|----------- R/W P3.2|----------- E | -- /CS | | | --- | 反相器 RESET |----| 。--- /RES -------- */ #include reg51.h sbit p_a0=P3^0; sbit p_rw=P3^1; sbit p_e=P3^2; //指令写入函数 void ctrl(unsigned char c) { p_a0=1; //a0为1代表写入指令 p_rw=0; p_e
[单片机]
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

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

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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