嵌入式 字符设备驱动编程

原创 2013年12月02日 14:55:22

步骤一:编辑驱动文件

Mac_test.c

#include <linux/init.h>
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/version.h>
#include <linux/types.h>
#include <linux/errno.h>
#include <linux/interrupt.h>
#include <linux/dma-mapping.h>
#include <linux/fs.h>
#include <linux/platform_device.h>
#include <linux/miscdevice.h>
#include <linux/clk.h>
#include <linux/device.h>
#include <linux/cdev.h>
#include <asm/irq.h>
#include <asm/io.h>
#include <asm/uaccess.h>
#include <mach/hardware.h>
#include <asm/dma.h>
#include <asm/delay.h>
#include <linux/delay.h>

MODULE_LICENSE("DualBSD/GPL");

 

unsigned intmajor=0;//主设备号

unsigned intminor=0;//副设备号

structcdev mac_dev; //字符设备结构体

 

ssize_tmac_read(struct file*fp,char __user *buf,size_t count,loff_t *f_pos)

{

memcpy(buf,"mac",count);

returncount;

}

 

intmac_open(struct inode *inodp,struct file *filp)

{

printk("open Macdevice success!\n");

return0;

}

intmac_close(struct inode *inodp,struct file *filp)

{

printk("close Macdevice success!\n");

return0;

}

structfile_operations t_fops={

.owner=THIS_MODULE,

.open=mac_open,

.read=mac_read,

.release=mac_close

};

 

dev_tdev_no;//设备号结构体

staticint mac_init(void)

{

intret;

 

printk("come inkernel...\n");

cdev_init(&mac_dev,&t_fops);

mac_dev.owner=THIS_MODULE;

 

if(major)

{

dev_no=MKDEV(major,minor);

ret=register_chrdev_region(dev_no,1,"Mac");//这里的Mac为设备文件名

if(ret<0)

{

printk("registererror!\n");

}

}

else{

ret=alloc_chrdev_region(&dev_no,0,1,"Mac");

if(ret<0)

{

printk("unregistererror!\n");

}

}

//register_chrdev(major,"mac_test",&t_fops);

cdev_add(&mac_dev,dev_no,1);

return0;

}

staticvoid mac_exit(void)

{

cdev_del(&mac_dev);

unregister_chrdev_region(dev_no,1);

//unregister_chrdev(major,"Mac");

printk("leave fromkernel...\n");

return;

}

 

module_init(mac_init);

module_exit(mac_exit);

MODULE_AUTHOR("Mac");

 

步骤二:创建Makefile文件

 

ifneq($(KERNELRELEASE),)

 

obj-m:=mac_test.o

 

else

 

KDIR:=/lib/modules/2.6.28/build

all:

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

clean:

-rm -f*.markers *.order *.ko *.o *.mod.o *.mod.c *.symvers

#make -C $(KDIR) M=`pwd` modulesclean

Endif

 

步骤三:编译产生mac_test.ko模块文件(module)并加载上。

#make

#insmodmac_test.ko 加载模块

#cat/proc/devices 查看主设备号(这里查看到的Mac设备的主设备号为250)

#mknod/dev/Mac c 250 0 创建设备文件,主设备号为250副设备号为0(主副设备号可在mac_test.c 文件中定义好)

 

步骤四:编写简单应用程序,打开设备文件Mac进行测试

Application.c

//本测试应用程序实现打开设备文件,并从内核中读取一个字符串,输出显示。

#include

#include

#include

#include

 

intmain()

{

intfd;

charbuf[10]={0};

if((fd=open("/dev/Mac",O_RDONLY))==-1)

printf("openerror!\n");

elseprintf("open ok!\n");

read(fd,buf,3);

printf("buf:%s\n",buf);

close(fd);

return0;

}

以下为操作指令:

#gccApplication.c

#./a.out进行测试打开设备文件

#openok!

buf:Mac

#rmmodmac_test

#dmesg查看内核日志

………….

………….

come inkernel...

openMac device success!

closeMac device success!

leavefrom kernel...

以上内核日志表示,模块加载完成,设备文件被打开、关闭,然后卸载了模块。

简单字符设备驱动实验操作完毕,其他设备驱动文件应依照此流程进行学习领会。

驱动你我人生------Mac嵌入式 <wbr>字符设备驱动编程

相关文章推荐

深入理解Linux字符设备驱动

文章从上层应用访问字符设备驱动开始,一步步地深入分析Linux字符设备的软件层次、组成框架和交互、如何编写驱动、设备文件的创建和mdev原理,对Linux字符设备驱动有全面的讲解。...

nandflash原理及硬件操作

我们先看下nandflash的布线 有data0 到data7 八根数据线 nandflash是个存储芯片,那我提出请求:读地址a的数据,把数据b写到a地址上去 那么我们看原理图...

Linux内核与驱动开发学习总结:中断和中断处理(八)

硬中断: 1. 硬中断是由硬件产生的,比如,像磁盘,网卡,键盘,时钟等。每个设备或设备集都有它自己的IRQ(中断请求)。基于IRQ,CPU可以将相应的请求分发到对应的硬件驱动上(注:硬件驱动通常是内...
  • fenggui
  • fenggui
  • 2015年06月07日 12:04
  • 841

嵌入式学习笔记——字符设备驱动编写

开发环境:Ubuntu 12.04        开发板:龙芯1B开发板  内核版本是3.0.1            linux的外设可以分为三类:字符设备(character device)、...

嵌入式学习-驱动开发-lesson1-字符设备驱动模型

驱动模型分析 在Linux系统中,设备的类型非常繁多,如:字符设备,块设备,网络接口设备,USB设备,PCI设备,平台设备,混杂设备……,而设备类型不同,也意味着其对应的驱动程序模型不同,但是这些驱...

嵌入式学习-驱动开发-lesson2-LED字符设备驱动

一、设备控制1)设备控制应用函数在用户空间,主要是使用ioctl系统调用来控制设备。 int ioctl(int fd,unsigned long cmd,…) fd: 要控制的设备文件描述符 ...

嵌入式Linux之字符设备驱动

嵌入式Linux之字符设备驱动本文档从Linux字符设备入手,描述一个字符设备在内核编译产生,进而在应用层被调用的过程。通过对字符设备的研究,一窥Linux设备驱动程序的工作机制。...
  • iemink
  • iemink
  • 2016年01月31日 15:31
  • 190

嵌入式Linux字符设备驱动模型详解

在Linux系统中,设备的类型非常多。比如:字符设备,块设备,网络设备接口设备,PCI设备,USB设备,平台设备,混杂设备。设备类型不同,对应的驱动模型也不同。Linux下开发设备驱动程序要遵循内核模...

嵌入式linux字符设备驱动

1. 我们需要先调用register_chrdev_region()或 alloc_chrdev_region()来向系统申请设备号     int register_chrdev_region...
  • maopig
  • maopig
  • 2012年03月30日 10:42
  • 1042
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:嵌入式 字符设备驱动编程
举报原因:
原因补充:

(最多只允许输入30个字)