rfid6-写成platform驱动

来源:互联网 发布:sqlserver except 编辑:程序博客网 时间:2024/06/14 17:59
将前面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 handlerfid    initialized[root@FriendlyARM plg]# cat /dev/rfid open_flag=1read_rfid1HZ=200rc522.c-PcdRequest: status = 0*********** discard card typr***********dicover card serial numce1ed4c7*********** selected card*********** right password*********** the first reading card success,as follows fltchr.chr[0]=17fltchr.chr[1]=0fltchr.chr[2]=d5fltchr.chr[3]=42fltchr.flt=1121255447*********** write card with the data as follows fltchr.flt=1121255453fltchr.chr[0]=1dfltchr.chr[1]=0fltchr.chr[2]=d5fltchr.chr[3]=42Write_First_Data[0]=1dWrite_First_Data[1]=0Write_First_Data[2]=d5Write_First_Data[3]=42*********** write to card success with the data above*********** the second reading card success,as followsfltchr.chr[0]=1dfltchr.chr[1]=0fltchr.chr[2]=d5fltchr.chr[3]=42fltchr.flt=1121255453read_rfid2[root@FriendlyARM plg]# 

http://download.csdn.net/detail/songqqnew/3716591
原创粉丝点击