将前面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 inS3C2410_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=0if (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_rfid1HZ=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

转载于:https://www.cnblogs.com/-song/archive/2011/10/25/3331940.html

rfid6-写成platform驱动相关推荐

  1. rfid3-micro2440,linux2.6.32.2,写成misc驱动

    接上文的进度,将keil下已经成功的读卡程序写成linux驱动的形式 采用misc来写比较方便简单,仅是为了方便测试,好多都在驱动中实现. 主文件是rfid.c #include "rc52 ...

  2. rfid5-写成platform驱动

    上文platform驱动虽然可用,但内层要要写misc驱动,所以不使用设备提供的资源会更加简便.可以如下改一下 Makefile,同上文 ifneq ($(KERNELRELEASE),) obj-m ...

  3. rfid4-写成platform驱动

    适应时代发展,将misc驱动封装到platfrom总线里面去, platform平台总线模型,把设备和驱动分开,即一个东东要分成两个部分去写和去insmod,是不是有点麻烦.--对于固定于一个cpu平 ...

  4. linux platform 驱动模型分析

    一. 概述     platform设备和驱动与linux设备模型密切相关.platform在linux设备模型中,其实就是一种虚拟总线没有对应的硬件结构.它的主要作用就是管理系统的外设资源,比如io ...

  5. platform驱动模型使用总结

    platform平台总线驱动的编写主要分为两个部分: 一个是platform_device部分,主要是提供设备本身对驱动处理所要求的参数. 另一个是platform_driver部分,主要是利用pla ...

  6. 驱动程序开发:无设备树和有设备树的platform驱动

    1.Linux 驱动的分离与分层   对与对IO进行最简单的读写操作,无需考虑太多的怎么使它重用性强,而像I2C. SPI.LCD 等这些复杂外设的驱动,Linux 系统要考虑到驱动的可重用性,因此提 ...

  7. platform驱动

    目录 1.Linux驱动的分离与分层 1)驱动的分隔与分离 2)驱动的分层 2.platform平台驱动模型简介 1)platform总线 2)platform驱动 3)platform设备 3.试验 ...

  8. <Linux开发>驱动开发 -之-platform 驱动

    <Linux开发>驱动开发 -之-platform 驱动 交叉编译环境搭建: <Linux开发> linux开发工具-之-交叉编译环境搭建 uboot移植可参考以下: < ...

  9. Linux dts设备树和platform驱动详解

    概念 小麦大叔 2019-05-06 22:56:31 12603 收藏 135 什么是设备树 dts(device tree)? 设备树(Device Tree)是描述计算机的特定硬件设备信息的数据 ...

最新文章

  1. java 判断语句 性能_前端性能优化:js中优化条件判断语句
  2. delphi里用java_如何在整个Delphi应用程序中使用ID
  3. 【Tools】Linux远程连接工具(PuTTY)
  4. 终于找到你!如何将前端console.log的日志保存成文件?
  5. C# 读写ACCESS的OLE对象,演示图片与长文件的读写
  6. Scude导入MySQL_FM2017_FMF赛季更新和真实修正数据库[更新至9.9,超过89000个更新]
  7. HTML5 SVG
  8. 成功领导者的20个好习惯
  9. python generator object_python - 将生成器对象转换为列表以进行调试
  10. 人工智能培训机构-光环国际,开课吧,贪心学院,交大,黑马,七月在线,咕泡,百战程序员哪个靠谱?
  11. 互联网电商都是怎么用工厂模式的?
  12. 任务含有时间窗与资源含有上下班时间的时间冲突约束构建思路
  13. rpg制作大师_在线RPG大师班
  14. Docker 教程:如何将Helix QAC作为容器创建并运行 上
  15. 大电流dcdc降压芯片20a_基于MC34063芯片DC-DC(20-5)降压型变换电路
  16. 以物理弦理论的角度浅理解悖论
  17. 狄利克雷原理及其应用
  18. Linux下脚本编写局域网扫描工具
  19. linux下 部署调用SAP接口
  20. 详解运放及其补偿技术

热门文章

  1. 7. SQL -- 创建数据库(表,字段)
  2. Android错误-error:Foundtextwhereitemtagisexpected
  3. android 监听手机开机
  4. Eclipse新建Android项目后,出现“The import android.support.v7.app cannot be resolved”
  5. 浅析在公众号中使用弛声sdk为什么上传解析慢
  6. python数据拼接: pd.concat
  7. Redis-RDB持久化设置
  8. 团队冲刺第六天个人博客
  9. node-inspector使用方法
  10. 【c基础】之 文件及其操作