rfid6-写成platform驱动

将前面rfid的misc挂到platform平台上,因为misc驱动都有了,所以很简单,代码复制过来就好了
设备侧就用上文的那个就好
/******************platfrom_dev.c***************************/  
#include <linux/module.h>  
#include <linux/device.h>  
#include <linux/platform_device.h>  
#include <linux/string.h>  
#include <linux/init.h>  
#include <linux/kernel.h>  
  
#define DEVICE_NAME "song_rfid"  
static struct platform_device *my_device;  
  
static int __init my_init(void)  
{  
    int ret=0;  
  
    my_device= platform_device_alloc(DEVICE_NAME,-1);//this name is matched for driver,song_rfid  
    ret=platform_device_add(my_device);  
  
    if (ret == 0) {  
        printk("Register %s\n",DEVICE_NAME);  
    } else {  
        printk("Register  error.\n");  
        platform_device_put(my_device);  
    }  
    return ret;  
}  
  
static void __exit my_exit(void)  
{  
    platform_device_unregister(my_device);  
    printk("Unregister %s\n",DEVICE_NAME);  
}  
  
module_init(my_init);  
module_exit(my_exit);  
  
MODULE_LICENSE("GPL");  
MODULE_VERSION("1.5"); 
驱动侧,就把misc驱动的init函数中实现的内容比如misc_register,射频初始化等放到platform的probe函数中即可
#include "rc522.h"
#define DEVICE_NAME "rfid"

#include <linux/module.h>  
#include <linux/device.h>  
#include <linux/platform_device.h>  
#include <linux/string.h>  
#include <linux/init.h>  
#include <linux/kernel.h>  
#include <linux/io.h>  

#define DRIVER_NAME "song_rfid"  

unsigned char  LastKeyA[6]={0xFF,0xFF,0xFF,0xFF,0xFF,0xFF};//NO.2卡
unsigned char  NewKeyA[6]={0x19,0x84,0x07,0x15,0x76,0x14};//NO.2卡
unsigned char  NewKey[16]={0x19,0x84,0x07,0x15,0x76,0x14,
                0xff,0x07,0x80,0x69,
                0x19,0x84,0x07,0x15,0x76,0x14};

unsigned char  Read_Data[16]={0x00};
unsigned char  Write_First_Data[16];
unsigned char  Write_Consume_Data[16];
unsigned char  RevBuffer[30];
unsigned char  MLastSelectedSnr[4];
unsigned char  oprationcard;

extern signed char PcdReset(void);
extern signed char PcdRequest(unsigned char  req_code,unsigned char *pTagType);
extern void PcdAntennaOn(void);
extern void PcdAntennaOff(void);
extern signed char M500PcdConfigISOType(unsigned char  type);
extern signed char PcdAnticoll(unsigned char *pSnr);
extern signed char PcdSelect(unsigned char *pSnr);
extern signed char PcdAuthState(unsigned char  auth_mode,unsigned char  addr,unsigned char *pKey,unsigned char *pSnr);
extern signed char PcdWrite(unsigned char  addr,unsigned char *pData);
extern signed char PcdRead(unsigned char  addr,unsigned char *pData);
extern signed char PcdHalt(void);

 union flt_chr
{
  //float flt;
  int flt;
  unsigned char chr[4];
}fltchr;

void delay_5ms(int x)

{
unsigned long j=jiffies+x*10;
while(jiffies<j) {;}


}

unsigned long rfid_table [] = {
    S3C2410_GPF(0),//nss out 
    S3C2410_GPF(1),//sck out 
    S3C2410_GPF(2),//mosi out 
    S3C2410_GPF(3),//miso in
    S3C2410_GPF(4),//rst  out
};
unsigned int rfid_cfg_table [] = {
    S3C2410_GPIO_OUTPUT,
    S3C2410_GPIO_OUTPUT,
    S3C2410_GPIO_OUTPUT,
    S3C2410_GPIO_INPUT,
    S3C2410_GPIO_OUTPUT,
};

int open_flag;
void InitRc522(void)
{
  PcdReset();
  PcdAntennaOff();  
  PcdAntennaOn();
  M500PcdConfigISOType( 'A' );
}
void ctrlprocess(void)
{
 
  char  status;    
  int ii;
  printk("\n");
  printk("HZ=%d\n",HZ);
/**********************************************寻卡**************************************************************/
  status=PcdRequest(PICC_REQIDL,&RevBuffer[0]);//寻天线区内未进入休眠状态的卡,返回卡片类型 2字节
  if(status!=MI_OK)
  {    printk("XXXXXXXXXXXXXXXX no card type\n");
    return;
  }
   printk("*********** discard card typr\n");
 /**********************************************返回序列号**************************************************************/
 status=PcdAnticoll(&RevBuffer[2]);//防冲撞,返回卡的序列号 4字节
  if(status!=MI_OK)
  {
        printk("XXXXXXXXXXXXXXXX no card serial num\n");
    return;
  }    
    printk("***********dicover card serial num\n");


     memcpy(MLastSelectedSnr,&RevBuffer[2],4);
     for(ii=0;ii<4;ii++)
  {
    printk("%x",(MLastSelectedSnr[ii]>>4)&0x0f);
    printk("%x",MLastSelectedSnr[ii]&0x0f);
  }
 /**********************************************选卡**************************************************************/
     memcpy(MLastSelectedSnr,&RevBuffer[2],4);
    status=PcdSelect(MLastSelectedSnr);//选卡
  if(status!=MI_OK)
  {
   printk("XXXXXXXXXXXXXXXX selected no card\n");
    return;
  }
   printk("*********** selected card\n");
 /**********************************************验证密码,扇区1,扇区1的控制块,地址为7********************************/
        status=PcdAuthState(PICC_AUTHENT1A,7,NewKeyA,MLastSelectedSnr);
    if(status!=MI_OK)
    { printk("XXXXXXXXXXXXXXXX not right password \n");
      return;
    }
    printk("*********** right password\n");

    status=PcdRead(4,Read_Data);  //读卡   *********************************************************
    if(status!=MI_OK)
    {
    printk("XXXXXXXXXXXXXXXX the first reading card failed\n");
          return;
    }
    printk("*********** the first reading card success,as follows \n");
    for(ii=0;ii<4;ii++)
    {
          fltchr.chr[ii]=Read_Data[ii];
    printk("fltchr.chr[%d]=%x\n",ii,fltchr.chr[ii]);
    }
    printk("fltchr.flt=%d\n",fltchr.flt);
 /**********************************************写卡,扇区1,扇区1的控第一个数据块,地址为4********************************/
     //fltchr.flt=108;
    fltchr.flt+=6;
    
    printk("*********** write card with the data as follows \n");
    printk("fltchr.flt=%d\n",fltchr.flt);
       for(ii=0;ii<4;ii++)        
    {
      Write_First_Data[ii]=fltchr.chr[ii];
     printk("fltchr.chr[%d]=%x\n",ii,fltchr.chr[ii]);
    }
    for(ii=0;ii<4;ii++)    printk("Write_First_Data[%d]=%x\n",ii,Write_First_Data[ii]);    
    status=PcdWrite(4,&Write_First_Data[0]);    //写卡*********************************
    if(status!=MI_OK)
    {
    printk("XXXXXXXXXXXXXXXX write to card failed \n") ;     
    printk("status=%d\n",status);  
    return;
    }    
         printk("*********** write to card success with the data above\n") ;     

    status=PcdRead(4,Read_Data);  //读卡   *********************************************************
    if(status!=MI_OK)
    {
        printk("XXXXXXXXXXXXXXXX the first reading card failed\n");
          return;
    }
    printk("*********** the second reading card success,as follows\n");
    for(ii=0;ii<4;ii++)
    {
        fltchr.chr[ii]=Read_Data[ii];
         printk("fltchr.chr[%d]=%x\n",ii,fltchr.chr[ii]);
    }
        printk("fltchr.flt=%d\n",fltchr.flt);
        
}

static ssize_t write_rfid(struct file *filp, const char *buffer, size_t count, loff_t *ppos)
{            

    int ret;
    char *commad=0;
    if (count == 0) {
        return count;
    }
    commad=kmalloc(count+1,GFP_KERNEL);//need print it using %s, so plus 1 byte for '\0'
    ret = copy_from_user(commad, buffer, count);//if success,ret=0
    if (ret) {
        return ret;
    }
    commad[count]='\0';
    printk("from kernel commad=%s\n",commad);
    printk("from kenel ret=%d\n",ret);
    
//to test the command "set to 1" or "clear to 0" if correct 
    if(strncmp(commad,"SET_SPI_CS",count)==0) {SET_SPI_CS;printk("excuting %s succes !\n",commad);}    
    if(strncmp(commad,"CLR_SPI_CS",count)==0) {CLR_SPI_CS;printk("excuting %s succes !\n",commad);}

    if(strncmp(commad,"SET_SPI_CK",count)==0) {SET_SPI_CK;printk("excuting %s succes !\n",commad);}
    if(strncmp(commad,"CLR_SPI_CK",count)==0) {CLR_SPI_CK;printk("excuting %s succes !\n",commad);}

    if(strncmp(commad,"SET_SPI_MOSI",count)==0) {SET_SPI_MOSI;printk("excuting %s succes !\n",commad);}
    if(strncmp(commad,"CLR_SPI_MOSI",count)==0) {CLR_SPI_MOSI;printk("excuting %s succes !\n",commad);}

    if(strncmp(commad,"SET_RC522RST",count)==0) {SET_RC522RST;printk("excuting %s succes !\n",commad);}
    if(strncmp(commad,"CLR_RC522RST",count)==0) {CLR_RC522RST;printk("excuting %s succes !\n",commad);}
    kfree(commad);
    return ret ? ret : count;
    
}
static ssize_t read_rfid(struct file *filp, char *buffer, size_t count, loff_t *ppos)
{    printk("read_rfid1\n");    
    ctrlprocess();    
    printk("read_rfid2\n");    
    return 0;
}


static int release_rfid(struct inode *inode, struct file *filp)
{
    return 0;
}

static int open_rfid(struct inode *inode, struct file *filp)
{    
    open_flag=1;
    printk("open_flag=%d\n",open_flag);
    return 0;
}




static struct file_operations dev_fops = {
    .owner    =    THIS_MODULE,
    .open    =    open_rfid,
    .read    =    read_rfid,
    .write    =    write_rfid,
    .release=    release_rfid,
};

static struct miscdevice misc = {
    .minor = MISC_DYNAMIC_MINOR,
    .name = DEVICE_NAME,
    .fops = &dev_fops,
};
/**************************** 以上属于misc ************************/




/**************************** 以下属于platform ************************/

/*在平台驱动probe函数中实现misc功能型驱动注册,及其他咚咚初始化*/
static int  my_probe(struct platform_device *pdev)  
{  
int ret,i;
printk("driver find device : %s which can handle\n",DRIVER_NAME); 
for (i = 0; i < 5; i++) {
    s3c2410_gpio_cfgpin(rfid_table[i], rfid_cfg_table[i]);
    s3c2410_gpio_setpin(rfid_table[i], 0);
}

ret = misc_register(&misc);
    InitRc522()    ;
printk (DEVICE_NAME"\tinitialized\n");
open_flag=0;
return ret;

}  
/*在平台驱动remove函数中实现misc驱动的注销*/
static int  my_remove(struct platform_device *pdev)  
{  
misc_deregister(&misc);
printk("driver found device : %s unpluged\n",DRIVER_NAME);  
return 0;  
}  

static struct platform_driver my_driver = {  
.probe      = my_probe,  
.remove     = my_remove,  
.driver     = {  
    .owner  = THIS_MODULE,  
    .name   = DRIVER_NAME,//this name is matched for driver,song_rfid  
},  
};  
/*在驱动入口函数init中实现平台驱动的注册*/
static int __init my_init(void)  
{  
printk("Register my_driver.\n");  
return platform_driver_register(&my_driver);  
}  
/*在驱动注销函数中实现平台驱动的注销*/
static void __exit my_exit(void)  
{  
printk("Unregister my_driver.\n");  
platform_driver_unregister(&my_driver);  
} 

module_init(my_init);  
module_exit(my_exit);  
MODULE_LICENSE("GPL");  

[root@FriendlyARM plg]# insmod platform_dev.ko 
Register song_rfid
[root@FriendlyARM plg]# insmod mymodule.ko           //之后就会出现设备文件/dev/rfid 
Register my_driver.
driver find device : song_rfid which can handle
rfid    initialized
[root@FriendlyARM plg]# cat /dev/rfid 
open_flag=1
read_rfid1

HZ=200
rc522.c-PcdRequest: status = 0
*********** discard card typr
***********dicover card serial num
ce1ed4c7*********** selected card
*********** right password
*********** the first reading card success,as follows 
fltchr.chr[0]=17
fltchr.chr[1]=0
fltchr.chr[2]=d5
fltchr.chr[3]=42
fltchr.flt=1121255447
*********** write card with the data as follows 
fltchr.flt=1121255453
fltchr.chr[0]=1d
fltchr.chr[1]=0
fltchr.chr[2]=d5
fltchr.chr[3]=42
Write_First_Data[0]=1d
Write_First_Data[1]=0
Write_First_Data[2]=d5
Write_First_Data[3]=42
*********** write to card success with the data above
*********** the second reading card success,as follows
fltchr.chr[0]=1d
fltchr.chr[1]=0
fltchr.chr[2]=d5
fltchr.chr[3]=42
fltchr.flt=1121255453
read_rfid2
[root@FriendlyARM plg]# 

http://download.csdn.net/detail/songqqnew/3716591
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 8
    评论
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值