[国嵌攻略][112][使用字符设备驱动]

编译/安装驱动程序

在Linux系统中,驱动程序通常采用内核模块的程序结构来进行编码。因此编译/安装一个驱动程序,其实就是编译/安装一个内核模块。

示例:

make

insmod memdev.ko

创建设备文件

应用程序->设备文件->驱动程序

通过字符设备文件,应用程序可以使用相应的字符设备驱动程序来控制字符设备。创建字符设备文件的方法一般有两种:

1.使用mknod命令

mknod /dev/文件名 c 主设备号 次设备号

驱动程序通过主设备号与字符设备文件一一对应,驱动程序的主设备号可以同过cat /proc/devices来查看,次设备号取非负数。c表示是字符设备。

2.使用函数在驱动程序中创建。

示例:

mknod /dev/memdev0 c 253 0

应用程序编写

arm-linux-gcc –static write.c –o write

arm-linux-gcc –static read.c –o read

Makefile

obj-m := memdev.o
KDIR := /space/work/guoqian/liunxkernel/000/kernel/linux-mini2440

all :
    make -C $(KDIR) M=$(PWD) modules ARCH=arm CROSS_COMPILE=arm-linux-

clean :
    @rm -f *.o *.ko *.mod.* *.order *.symvers

write.c

#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>

int main(int argc, char **argv){
    //打开设备文件
    int fd;

    fd = open("/dev/memdev0", O_RDWR);

    //写入数据
    int num;

    num = 2016;
    write(fd, &num, sizeof(num));

    //关闭设备文件
    close(fd);

    return 0;
}

read.c

#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdio.h>

int main(int argc, char **argv){
    //打开设备文件
    int fd;

    fd = open("/dev/memdev0", O_RDWR);

    //读取数据
    int num;

    read(fd, &num, sizeof(num));
    printf("num is %d\n", num);

    //关闭设备文件
    close(fd);

    return 0;
}
时间: 2024-10-14 17:06:52

[国嵌攻略][112][使用字符设备驱动]的相关文章

[国嵌攻略][147][简单块设备驱动设计]

头文件 #include <linux/blkdev.h> #include <linux/bio.h> blkdev.c /******************************************************************** *头文件 *********************************************************************/ #include <linux/init.h> #incl

[国嵌攻略][155][I2C用户态驱动设计]

用户态驱动模型 用户态驱动模型首先是一个应用程序,其次是在这个用户程序中通过内核调用来驱动设备. IIC通用驱动代码 IIC通用驱动程序的代码在/drivers/i2c/i2c-dev.c中.一次读操作或者一次写操作就是一条消息. EEPROM用户态驱动 IIC通用设备对应/dev/i2c-0设备文件. 1.打开通用设备驱动 2.构造写数据到eeprom的消息 3.使用ioctl写入数据 4.构造从eeprom读数据的消息 5.使用ioctl读出数据 6.关闭设备 配置IIC驱动 make me

[国嵌攻略][133][网卡驱动架构分析]

Linux网络子系统 1.系统调用接口:提供系统调用 2.协议无关接口:统一网络协议给系统调用接口使用 3.网络协议栈  :实现网络协议 4.设备无关接口:统一设备驱动程序给网络协议使用 5.设备驱动程序:实现网卡驱动 Linux驱动在内核中都有一个结构来描述,首先找到设备描述结构,然后找到设备如何注册和初始化. 网卡描述结构 在Linux内核中,每个网卡都由一个net_device结构来描述,其中一些重要成员: char name[IFNAMSIZ]   设备名,如:eth%d unsigne

[国嵌攻略][116][字符设备控制技术]

设备控制理论 1.设备控制的作用 大部分驱动程序除了需要提供读写设备的能力外,还需要具备控制设备的能力.比如改变波特率. 2.设备控制的函数 在用户空间使用ioctl系统调用函数来控制设备. int ioclt(int fd, unsigned long cmd, ...) fd:要控制的设备文件描述符 cmd:发送给设备的命令 ...:第三个参数是可选的参数,存在与否是依赖于控制命令 当应用程序使用ioclt系统调用时,驱动程序将由如下函数来响应: 1. 2.6.36以前的内核 long (*

[国嵌攻略][117][LED驱动程序设计]

LED程序设计 1.编写内核模块 2.搭建字符驱动框架 3.实现设备方法 头文件 <linux/io.h> writel() leddev.h //设备命令 #define LED_MAGIC 'L' //LED幻数 #define LED_ON _IO(LED_MAGIC, 0) //打开LED #define LED_OFF _IO(LED_MAGIC, 1) //关闭LED leddev.c /***********************************************

[国嵌攻略][164][USB驱动程序设计]

USB驱动模型 1.USB host controller driver(主控器驱动):为USB主控制器提供驱动程序 2.USB core(USB核心):连接USB主控制器驱动和USB设备驱动 3.USB client driver:为USB外部设备提供驱动程序 USB设备模型 device(设备)->config(配置)->interface(接口)->endpoint(端点),构成了USB设备的四个层次.一个usb driver(驱动)对应的是一个interface(接口).一个接口

[国嵌攻略][135][网络子系统深度分析]

网络发包模型 1.选择路由 2.交给邻居子系统(路由中紧挨着发送方的网关).如果没有邻居信息,那么由Linux中的邻居子系统来建立邻居信息. 发送数据过程 //系统调用层和协议无关层 1.发送入口sock_aio_write 2.调用do_sock_write 3.调用__sock_sendmsg //网络协议栈 4.调用udp_sendmsg 5.调用ip_route_output_flow(选择路由) 6.调用udp_push_pending_frames 7.调用ip_push_pendi

[国嵌攻略][099][Linux内核配置与编译]

为什么要配置内核 基于硬件和软件的需求选出需要的功能,去掉不要的功能. 内核配置的方法 make config:基于文本交互的配置. make menuconfig:基于图形菜单的配置. make menuconfig配置方法 1.菜单项的分类 processor type and features   处理器类型 networking support            网络协议支持 device drivers                设备驱动支持 file systems     

[国嵌攻略][156][I2C自编设备驱动设计]

AT24C08的驱动在Linux内核中已经提供,在/drivers/misc/eeprom/at24.c文件中.在对应的probe函数中有一个创建/sys/.../eeprom文件的函数,应用程序通过调用/sys/.../eeprom设备文件来对设备进行读写操作. 移植AT24C08驱动 1.修改内核注册eeprom设备 在kernel/linux-mini2440/arch/arm/mach-s3c2440.c中的machine_init下注册IIC设备. mach-mini2440.c st