热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

ARM&Linux下驱动开发第二节

驱动文件:qudong.c,make生成qudong.ko文件,烧录到ARM板上#include#include#include#include*COPY_TO_USER*#i

驱动文件:qudong.c,make生成qudong.ko文件,烧录到ARM板上

bubuko.com,布布扣id="code_img_closed_e8b0dbbf-6f60-43e1-8292-d206b09f646b" class="code_img_closed"
src="https://img8.php1.cn/3cdc5/15cae/696/97b72824c01465f4.gif">bubuko.com,布布扣 id="code_img_opened_e8b0dbbf-6f60-43e1-8292-d206b09f646b"
class="code_img_opened" Onclick="cnblogs_code_hide(‘e8b0dbbf-6f60-43e1-8292-d206b09f646b‘,event)"
src="https://img8.php1.cn/3cdc5/15cae/696/090ed4f852559c3b.gif">

#include
#include

#include

#include
/* COPY_TO_USER */
#include

#define DEV_NAME "rwtest"
static int major=0;
static int MAX_BUF_LEN=1024;
static char drv_buf[1024];
static int WRI_LENGTH=0;
/************************************写入*************************************************/
static ssize_t dx_write(struct file *file, const char __user *buffer, size_t count, loff_t * ppos)
{
if(count > MAX_BUF_LEN)count = MAX_BUF_LEN;
copy_from_user(drv_buf , buffer, count);
WRI_LENGTH
= count;
printk(
"write data to driver\n");
return count;
}
/**************************************读取***********************************************/
static ssize_t dx_read(struct file *filp, char __user *buffer, size_t count, loff_t *ppos)
{
int i=0,j=0;
if(count > MAX_BUF_LEN)
count
=MAX_BUF_LEN;
for(i=strlen(drv_buf);i>0;i--)
{
buffer[j]
=drv_buf[i-1];
j
++;
}
//copy_to_user(buffer,drv_buf,count);
printk("read data from driver\n");
return count;
}
//===========================打开=========================================
static int dx_open(struct inode *inode, struct file *filp)
{
printk(
"device open sucess!\n");
return 0;
}
/**********************************release***************************************************/
static int dx_release(struct inode *inode, struct file *filp)
{
printk(
"device release\n");
return 0;
}
//======================结构体,驱动各属性==================================================
static struct file_operations file_opt = {
owner: THIS_MODULE,
write: dx_write,
read: dx_read,
open: dx_open,
release:dx_release,
};
//----------------------------------------------------------------------
static int __init qudong_init(void)
{
int ret;
ret
= register_chrdev(0, DEV_NAME, &file_opt);
if(ret<0)
{
printk(DEV_NAME
" can‘t get major number\n");
return 0;
}
major
=ret;
printk(
"dx module major number is %d\n", ret);
return 0;
}
//-----------------------------------------------------------------------
static void __exit qudong_exit(void)
{
unregister_chrdev(major,DEV_NAME);
printk(
"exit\n");
}
module_init(qudong_init);
module_exit(qudong_exit);
MODULE_LICENSE(
"GPL");

View Code

Makefile文件:


bubuko.com,布布扣id="code_img_closed_023e5bc9-359b-4634-8469-20b3a7d817d6" class="code_img_closed"
src="https://img8.php1.cn/3cdc5/15cae/696/97b72824c01465f4.gif">bubuko.com,布布扣 id="code_img_opened_023e5bc9-359b-4634-8469-20b3a7d817d6"
class="code_img_opened" Onclick="cnblogs_code_hide(‘023e5bc9-359b-4634-8469-20b3a7d817d6‘,event)"
src="https://img8.php1.cn/3cdc5/15cae/696/090ed4f852559c3b.gif">

## Makefile template.
obj
-m := qudong.o
UNAME :
= $(shell uname -r)
PWD :
= $(shell pwd)
ADVMOD :
= qudong
defualt:
@make
-C /lib/modules/$(UNAME)/build SUBDIRS=$(PWD) modules
clean:
@rm
-f *.o
@rm
-f *.ko
@rm
-f *.mod.c
@rm
-f .*.cmd
@rm
-rf .tmp_versions
#endif

View Code

或者ARM下的Makefile文件:


bubuko.com,布布扣id="code_img_closed_8c4e8d20-85f9-4fb6-ae3e-fed08db13afe" class="code_img_closed"
src="https://img8.php1.cn/3cdc5/15cae/696/97b72824c01465f4.gif">bubuko.com,布布扣 id="code_img_opened_8c4e8d20-85f9-4fb6-ae3e-fed08db13afe"
class="code_img_opened" Onclick="cnblogs_code_hide(‘8c4e8d20-85f9-4fb6-ae3e-fed08db13afe‘,event)"
src="https://img8.php1.cn/3cdc5/15cae/696/090ed4f852559c3b.gif">

ifneq ($(KERNELRELEASE),)
obj
-m := hello.o
else
KDIR :
= /usr/src/linux2.6.28
all:
make
-C $(KDIR) M=$(PWD) modules ARCH=arm CROSS_COMPILE=arm-linux-
clean:
rm
-f *.ko *.o *.mod.o *.mod.c *.symvers modul*
endif

View Code

测试程序如下:


bubuko.com,布布扣id="code_img_closed_6e0a1919-d5ac-47f0-9028-40fe59727441" class="code_img_closed"
src="https://img8.php1.cn/3cdc5/15cae/696/97b72824c01465f4.gif">bubuko.com,布布扣 id="code_img_opened_6e0a1919-d5ac-47f0-9028-40fe59727441"
class="code_img_opened" Onclick="cnblogs_code_hide(‘6e0a1919-d5ac-47f0-9028-40fe59727441‘,event)"
src="https://img8.php1.cn/3cdc5/15cae/696/090ed4f852559c3b.gif">

#include
#include

#include

#include

#include

#include
<string.h>
int main()
{
int fd=0;
int ret=0;
char bufw[100]={\0};
char bufr[100]={\0};
fd
=open("/dev/rwtest",O_RDWR);
if(fd<0)
{
perror(
"open error\n");
return 0;
}
printf(
"Please input string:\n");
scanf(
"%s",bufw);
ret
=write(fd,bufw,strlen(bufw));
if(ret<0)
{
perror(
"write error\n");
return 0;
}
printf(
"burw====%s\n",bufw);
ret
=read(fd,bufr,99);
if(ret<0)
{
perror(
"read error\n");
return 0;
}
printf(
"bufr====%s\n",bufr);
close(fd);
return 0;
}

View Code

ARM&Linux 下驱动开发第二节,布布扣,bubuko.com


推荐阅读
author-avatar
波波无敌1989_424
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有