嵌入式 字符设备驱动编程

步骤一:编辑驱动文件

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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
《mx6u嵌入式linux c 应用编程指南》是一本针对嵌入式Linux系统的C语言应用编程指南。这本书主要介绍了mx6u嵌入式开发板上的Linux操作系统的基本知识和C语言编程技巧。 首先,本书介绍了Linux操作系统的概念、架构和配置,使读者能够了解Linux系统的基本原理和体系结构,为后续的应用程序开发打下了基础。同时,书中还介绍了嵌入式Linux系统的交叉编译环境的搭建方法和基本工具的使用,以及如何在开发板上进行调试和测试。 其次,本书重点介绍了嵌入式Linux系统的C语言应用编程技巧。其中包括Linux系统的基本库函数和系统调用的使用方法,文件操作、进程管理、信号处理、网络编程等常用编程技术。此外,本书还详细介绍了嵌入式Linux系统中常见的设备驱动程序开发方法,包括字符设备驱动、块设备驱动和网络设备驱动等。 最后,本书还提供了一些实际的应用示例,如基于mx6u开发板的嵌入式物联网应用、多媒体应用等。通过这些示例,读者可以加深对于嵌入式Linux系统的应用开发的理解,并掌握实际应用开发的方法和技巧。 总的来说,《mx6u嵌入式linux c 应用编程指南》通过系统地介绍嵌入式Linux系统的基本知识和C语言编程技巧,帮助读者掌握在mx6u嵌入式开发板上进行应用程序开发的基本技能。无论是对于初学者还是有一定经验的开发者,本书都是一本很好的学习和参考读物。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值