/*调用ic_request_irqs注册中断处理程序

*配置引脚*/intic_open (structinode*inode,structfile*filp)

{intnum;intret=0;

unsignedlongflags;

ICDEBUG(KERN_ALERT"open ic card\n");//获取次设备号num=MINOR(inode->i_rdev);

ICDEBUG(KERN_ALERT"MINOR:%d\n",num);if(num>=ICCARD_NR_DEVS)return-ENODEV;

spin_lock_irqsave(&lock,flags);

filp->private_data=&ic_dev_info[num];//检测IC卡是否已插入设备s3c2410_gpio_cfgpin(S3C2410_GPG6,S3C2410_GPG6_INP);//ICCARD_INTEREPTif((__raw_readw(S3C2410_GPGDAT)&(1<<6))==0<<6)

{

ic_dev_info[num].ic_state=1;//代表卡已插入ic_dev_info[num].r_press=1;//设备可读ic_dev_info[num].w_press=1;//设备可写ICDEBUG(KERN_ALERT"has ic card device\n");

}else{

ic_dev_info[num].ic_state=0;//代表卡已插入ic_dev_info[num].r_press=0;//设备可读ic_dev_info[num].w_press=0;//设备可写ICDEBUG(KERN_ALERT"no found ic card device\n");

}

spin_unlock_irqrestore(&lock,flags);//初始化输入输出引脚init_gpio();

ICDEBUG(KERN_ALERT"open ic card success\n");returnret;

}intic_release(structinode*inode,structfile*filp)

{//ic_free_irqs();return0;

}/**从ic卡中读出一个字节的数据*/intic_card_read_byte(char*ch)

{intret=0;intii;for(ii=8; ii>0; ii--)

{

CLR_CARD_CLK();

udelay(5);*ch=(*ch)>>1;//从低位读起//if((__raw_readw(S3C2410_GPGDAT)&0x0008)==0x0008)if((__raw_readw(S3C2410_GPGDAT)&(1<<3))==1<<3)

{*ch|=0x80;

ICDEBUG(KERN_ALERT"\n");

}else{

ICDEBUG(KERN_ALERT"\n");

}

udelay(5);

SETB_CARD_CLK();

}

ICDEBUG(KERN_ALERT"ic_card_read_byte:ch is>>>>>(%c)\n",*ch);returnret;

}intic_card_write_byte(char*ch)

{intret=0;intii;

ICDEBUG(KERN_ALERT"enter ic_card_write_byte,ch is %c\n",*ch);for(ii=0; ii<8; ii++)

{

CLR_CARD_CLK();

udelay(5);if(*ch&0x01)

{

ICDEBUG(KERN_ALERT"[+++++$++++++++]\n");

SETB_CARD_IO();//输入1}else{

ICDEBUG(KERN_ALERT"[-----$--------]\n");

CLR_CARD_IO();//输入0}

udelay(5);

SETB_CARD_CLK();

udelay(10);*ch=*ch>>1;

}returnret;

}/**复位和复位应答*/staticintic_card_reset(void)

{

unsignedchartemp_ch;inttemp_i=4;

s3c2410_gpio_cfgpin(S3C2410_GPG3,S3C2410_GPG3_OUTP);//OUTudelay(5);

CLR_CARD_RESRT();

CLR_CARD_CLK();

SETB_CARD_IO();

udelay(5);

SETB_CARD_RESRT();

udelay(5);

SETB_CARD_CLK();

udelay(30);

CLR_CARD_CLK();

udelay(5);

CLR_CARD_RESRT();

s3c2410_gpio_cfgpin(S3C2410_GPG3,S3C2410_GPG3_INP);//INudelay(10);do{//temp_ch = ic_card_read_byte();ic_card_read_byte(&temp_ch);

ICDEBUG(KERN_ALERT"ic_card_reset:temp_ch is(%c)\n",temp_ch);

}while(--temp_i>0);

CLR_CARD_CLK();

s3c2410_gpio_cfgpin(S3C2410_GPG3,S3C2410_GPG3_OUTP);//INudelay(5);

SETB_CARD_IO();

udelay(5);

CLR_CARD_CLK();

udelay(5);return0;

}/**命令开始条件*/voidic_card_start_cmd(void)

{

s3c2410_gpio_cfgpin(S3C2410_GPG3,S3C2410_GPG3_OUTP);//outCLR_CARD_CLK();

SETB_CARD_IO();

udelay(5);

SETB_CARD_CLK();

udelay(5);

CLR_CARD_IO();

udelay(5);

}/**命令结束条件*/voidic_card_end_cmd(void)

{

s3c2410_gpio_cfgpin(S3C2410_GPG3,S3C2410_GPG3_OUTP);

CLR_CARD_CLK();

CLR_CARD_IO();

udelay(5);

SETB_CARD_CLK();

udelay(5);

SETB_CARD_IO();

udelay(5);

}/*发送命令*/voidic_card_send_cmd(constcharcmd,constcharaddr,constcharcount)

{

ICDEBUG(KERN_ALERT"enter ic_card_read:cmd is %c,addr is %c,count is %c\n",cmd,addr,count);

ic_card_start_cmd();

ic_card_write_byte(&cmd);

ic_card_write_byte(&addr);

ic_card_write_byte(&count);

ic_card_end_cmd();

}voidic_card_breakoperator(void)

{

s3c2410_gpio_cfgpin(S3C2410_GPG3,S3C2410_GPG3_OUTP);

CLR_CARD_CLK();

CLR_CARD_RESRT();

CLR_CARD_IO();

udelay(5);

SETB_CARD_RESRT();

SETB_CARD_IO();

udelay(5);

CLR_CARD_RESRT();

udelay(5);

}/*从设备中读取指定长度的数据*/ssize_t ic_dev_read(structfile*filep,constchar*buf, size_t count, loff_t*offset)

{intret=0;//wait_event_interruptible();//char *kbuf;intistate;intsizetmp;char*pbuf;//unsigned char ch=0;ic_card_dev*icdev=(ic_card_dev*)filep->private_data;

ICDEBUG(KERN_ALERT"enter ic_dev_read\n");

istate=icdev->ic_state;

ICDEBUG(KERN_ALERT"ic_dev_istate:%d\n",istate);

pbuf=buf;if(!istate)

{return-ENODEV;

}if(!pbuf)

{return-1;

}

sizetmp=count;

s3c2410_gpio_cfgpin(S3C2410_GPG3,S3C2410_GPG3_INP);//将GPG3配置成输入引脚CLR_CARD_CLK();

udelay(5);do{

ic_card_read_byte(pbuf++);//*buf++ = ic_card_read_byte();ret++;

ICDEBUG(KERN_ALERT"[ic_card_read:buf is (%c) ret:%d]\n",*(pbuf-1),ret);

}while(--sizetmp);returnret;

}/*往设备中写入数据*/ssize_t ic_dev_wrtie(structfile*filep,char*buf, size_t count, loff_t*offset)

{intret=0;intistate;

unsignedlongflags;intsizetmp;

ICDEBUG(KERN_ALERT"enter ic_dev_wrtie\n");

spin_lock_irqsave(&lock,flags);

istate=((ic_card_dev*)(filep->private_data))->ic_state;

spin_unlock_irqrestore(&lock,flags);if(!istate)

{return-ENODEV;

}if(!buf)return-1;//wait_event_interruptible();s3c2410_gpio_cfgpin(S3C2410_GPG3, S3C2410_GPG3_OUTP);//将GPG3配置成输出引脚sizetmp=count;do{

ic_card_write_byte(buf++);//按字节发送至ic卡}while(--sizetmp);returnret;

}/*file_operations read*/ssize_t ic_card_read(structfile*filep,char__user*buf, size_t count, loff_t*offset)

{//int ii;intret;char*kbuf;

unsignedlongflags;intr_press;

ICDEBUG(KERN_ALERT"enter ic_card_read\n");

spin_lock_irqsave(&lock,flags);

r_press=((ic_card_dev*)filep->private_data)->r_press;

spin_unlock_irqrestore(&lock,flags);

ICDEBUG(KERN_ALERT"ic_card_read:r_press is:%d\n",r_press);

wait_event_interruptible(r_wait, r_press!=0);

kbuf=kmalloc(count,GFP_KERNEL);if(!kbuf)

{return-ENOMEM;

}

spin_lock_irqsave(&lock,flags);

((ic_card_dev*)filep->private_data)->w_press=0;

spin_unlock_irqrestore(&lock,flags);

ic_card_reset();

ic_card_send_cmd((constchar)IC_RMM_CMD,(constchar)((ic_card_dev*)(filep->private_data))->readbufstart,0xff);

ret=ic_dev_read(filep, kbuf, count, offset);

ICDEBUG(KERN_ALERT"[ic_card_read kbuf is:%s]\n",kbuf);if(ret>=0)

{

ret=copy_to_user(buf,kbuf,count);

}

ICDEBUG(KERN_ALERT"\n",kbuf,buf,ret,count);

ic_card_breakoperator();

spin_lock_irqsave(&lock,flags);

((ic_card_dev*)filep->private_data)->w_press=1;

spin_unlock_irqrestore(&lock,flags);

kfree(kbuf);returnret;

}/*file_operations write*/ssize_t ic_card_wrtie(structfile*filep,char__user*buf, size_t count, loff_t*offset)

{intret;char*kbuf;

unsignedlongflags;intw_press;

ICDEBUG(KERN_ALERT"enter ic_card_wrtie\n");

spin_lock_irqsave(&lock,flags);

w_press=((ic_card_dev*)filep->private_data)->w_press;

spin_unlock_irqrestore(&lock,flags);

kbuf=kmalloc(count,GFP_KERNEL);if(!kbuf)

{return-ENOMEM;

}

wait_event_interruptible(r_wait, w_press!=0);//if(w_press)//{spin_lock_irqsave(&lock,flags);

((ic_card_dev*)filep->private_data)->r_press=0;

spin_unlock_irqrestore(&lock,flags);

ic_card_reset();

ic_card_send_cmd((constchar)IC_WMM_CMD,(constchar)((ic_card_dev*)(filep->private_data))->writebufstart,count);if(copy_from_user(kbuf, buf, count))

{

kfree(kbuf);return-EFAULT;

}

ICDEBUG(KERN_ALERT"copy_from_user kbuf------------->:%s\n",kbuf);

ret=ic_dev_wrtie(filep, kbuf, count, offset);

printk(KERN_ALERT"ic_dev_wrtie ret : %d\n",ret);

ic_card_breakoperator();

spin_lock_irqsave(&lock,flags);

((ic_card_dev*)filep->private_data)->w_press=1;

spin_unlock_irqrestore(&lock,flags);

kfree(kbuf);

ICDEBUG(KERN_ALERT"ic_card_wrtie success\n");returnret;

}intic_ioctl(structinode*inode,structfile*filep, unsignedintcmd, unsignedlongarg)

{

unsignedinticount;

unsignedlongflags;

spin_lock_irqsave(&lock,flags);switch(cmd)

{caseCFG_RD_COUNT:

icount=(unsignedint)arg;

((ic_card_dev*)filep->private_data)->readcount=icount;break;caseCFG_WR_COUNT:

icount=(unsignedint)arg;

((ic_card_dev*)filep->private_data)->writecount=icount;break;default:break;

}

spin_unlock_irqrestore(&lock,flags);return0;

}/*#define POLLIN 0x0001 //有数据可以读入,read不会阻塞,注意:select的请情况下,即使到EOF也是ready的.

#define POLLPRI 0x0002 //紧急数据,比如TCP,或者packet模式的peseudo-terminal发现slave的状态有变化.

#define POLLOUT 0x0004 //写入不会阻塞.

#define POLLERR 0x0008 //输出出错

#define POLLHUP 0x0010 //Hang up (output only).

#define POLLNVAL 0x0020 //Invalid request: fd not open (output only).

The rest seem to be more-or-less nonstandard. Check them!

#define POLLRDNORM 0x0040 //POLLIN.

#define POLLRDBAND 0x0080 //高优先级的数据read for read (generally unused on Linux).

#define POLLWRNORM 0x0100 //Equivalent to POLLOUT.

#define POLLWRBAND 0x0200 //Priority data may be written.

#define POLLMSG 0x0400

#define POLLREMOVE 0x1000*/unsignedintic_poll (structfile*filep,structpoll_table_struct*wait)

{intic_num=0;//testunsignedintmask=0;

unsignedlongflags;//加入这句话是为了在读写状态发生变化的时候,通知核心层,让核心层重新调用poll函数查询信息。

python开发板卡驱动开发_IC卡驱动程序开发相关推荐

  1. 基于DSP/BIoS设备驱动模型的视频驱动程序开发

    作者:天津科技大学 电子信息与自动化学院 严新忠,刘 喆 通过给外部设备编写驱动程序是一种有效的控制外设的方法.随着DSP的应用越来越广泛,DSP实时系统的日趋复杂及新技术的出现,DSP处理器所连接的 ...

  2. python开发板卡驱动开发_一款能让你发挥无限创意的MicroPython开发板—TPYBoard开发板测...

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 今天 静电袋包装,打开袋子简单明了:TPYBoard开发板一块.跳线帽一个.数据线一条.说明书一份.通过数据线将开发板与电脑连接就可以DIY各种你想要的P ...

  3. VxWorks设备驱动程序开发指南---驱动程序的分类

    8D Spaces Reliability & Stability & Efficiency 目录视图 摘要视图 订阅 VxWorks设备驱动程序开发指南(三)---驱动程序的分类 2 ...

  4. Linux驱动(驱动程序开发、驱动框架代码编译和测试)

    目录 什么是驱动: 设备分类: 驱动认知: 字符设备驱动工作原理 字符设备.字符设备驱动与用户空间访问该设备的程序三者之间的关系 驱动程序开发步骤 基于驱动框架的代码开发 驱动模块代码编译和测试 加载 ...

  5. linux 网络dma驱动,S3C2410的Linux下DMA驱动程序开发

    网上介绍Linux下的一般驱动程序开发示例浩如烟海,或是因为简单,关于DMA驱动的介绍却寥寥无几:近期因工作需要,花了几日时间开发了某设备在S3C2410处理器Linux下DMA通信的驱动程序,有感于 ...

  6. V4L2视频驱动程序开发之驱动方法poll 和 应用程序select

    V4L2视频驱动程序开发已经进入尾声,本次视频支持多个通道的stream同时传输,即有多个设备文件关联到驱动.最高支持48个stream同时输入. 应用程序在获取stream的时候,需要用到selec ...

  7. Linux USB 驱动开发(三)—— 编写USB 驱动程序

    前面学习了USB驱动的一些基础概念与重要的数据结构,那么究竟如何编写一个USB 驱动程序呢?编写与一个USB设备驱动程序的方法和其他总线驱动方式类似,驱动程序把驱动程序对象注册到USB子系统中,稍后再 ...

  8. 驱动开发思路以及应用程序与驱动程序的区别

    SOC: 采用的A7的核 片内设备: 1.片内控制器: i2c控制器.spi控制器.uart控制器.gpio控制器-- 2.总线: 平台总线 3.片内存储器: irom:掉电不丢失数据 iram:掉电 ...

  9. S3C2416裸机开发系列十六_sd卡驱动实现

    S3C2416裸机开发系列十六 sd卡驱动实现 象棋小子    1048272975 SD卡(Secure Digital Memory Card)具有体积小.容量大.数据传输快.可插拔.安全性好等优 ...

最新文章

  1. WPF学习拾遗(二)TextBlock换行
  2. Flask实战----做了一个简易版CSDN
  3. JavaSE、JavaEE与Spring的概念和异同点剖析
  4. MIUI 10 Android 原生字体,[教程] MIUI10全局字体替换教程,了解一下?
  5. windows网络编程第二版 第三章 Internet Protocol 读书笔记
  6. java开发文档怎么写_程序员该不该写技术文档,怎么写文档,易懂又能提升自己...
  7. python日期转化成周数_[转]浅析使用python计算两个日期间隔天数﹑周数和指定若干天后对应的日期等...
  8. 29muduo_net库源码分析(五)
  9. CF932E Team Work(第二类斯特林数)
  10. Windows 8 下使用 ScrollViewer 替代 GridView
  11. NOIP2013华容道
  12. 一份好的商业计划书该怎么写
  13. MCAFEE卸载软件测试初学者,迈克菲卸载软件怎么用(手把手教你彻底卸载干净)...
  14. 【题解】LuoGu4408:[NOI2003]逃学的小孩
  15. 计算机硬盘使用寿命,一块机械硬盘的寿命能超过十年吗?
  16. 竞价推广和信息流推广是什么?区别在哪里?
  17. 单元测试之moles
  18. 输入一个正整数n,计算并输出n的阶乘
  19. 摩托车新手驾驶教程[3]
  20. excel冻结窗口_Excel工作学习超高频实用技巧

热门文章

  1. ue4网格转地形_不用建模就能生成地形,SU怎么办到的?!
  2. 记录下我磕磕碰碰的三个月找工作经历,绝对干货
  3. 菜鸟的三遍读书法进阶
  4. adb push命令
  5. 科学计算机DEG进入,手机计算器全线阵亡是怎么回事?10%+10%到底等于几?附科学计算器使用指导...
  6. 【Linux回炉 目录配置】
  7. C语言指针学习与使用
  8. 每天坚持“踮脚尖”,时间久了,身体会收获什么?每天踮多久?
  9. SS14、SS24、SS34 区别
  10. 【渗透测试】CS DNS上线(DoH隧道+CS特征隐藏)