ARM&Linux 下驱动开发第二节

驱动文件:qudong.c,make生成qudong.ko文件,烧录到ARM板上
#include<linux/init.h>
#include<linux/module.h>
#include<linux/kernel.h>
#include <linux/poll.h>    /* COPY_TO_USER */
#include<linux/errno.h>
#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文件:

## 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文件:

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

测试程序如下:

#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/ioctl.h>
#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

 

 

posted @ 2014-03-05 20:40  爱在夕阳下  阅读(360)  评论(0编辑  收藏  举报