关闭

嵌入式 字符设备驱动编程

544人阅读 评论(0) 收藏 举报
分类:

步骤一:编辑驱动文件

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>字符设备驱动编程
0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:984649次
    • 积分:17684
    • 等级:
    • 排名:第540名
    • 原创:741篇
    • 转载:522篇
    • 译文:0篇
    • 评论:105条
    最新评论