日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 运维知识 > linux >内容正文

linux

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

發(fā)布時(shí)間:2024/4/14 linux 49 豆豆
生活随笔 收集整理的這篇文章主要介紹了 rfid3-micro2440,linux2.6.32.2,写成misc驱动 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
接上文的進(jìn)度,將keil下已經(jīng)成功的讀卡程序?qū)懗蒷inux驅(qū)動(dòng)的形式
采用misc來(lái)寫(xiě)比較方便簡(jiǎn)單,僅是為了方便測(cè)試,好多都在驅(qū)動(dòng)中實(shí)現(xiàn)。
主文件是rfid.c
#include "rc522.h" #define DEVICE_NAME "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]);//尋天線區(qū)內(nèi)未進(jìn)入休眠狀態(tài)的卡,返回卡片類(lèi)型 2字節(jié)if(status!=MI_OK){ printk("XXXXXXXXXXXXXXXX no card type\n");return;}printk("*********** discard card typr\n");/**********************************************返回序列號(hào)**************************************************************/status=PcdAnticoll(&RevBuffer[2]);//防沖撞,返回卡的序列號(hào) 4字節(jié)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");/**********************************************驗(yàn)證密碼,扇區(qū)1,扇區(qū)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);/**********************************************寫(xiě)卡,扇區(qū)1,扇區(qū)1的控第一個(gè)數(shù)據(jù)塊,地址為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]); //寫(xiě)卡*********************************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 代碼做管腳測(cè)試用到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);}return ret ? ret : count;} static ssize_t read_rfid(struct file *filp, char *buffer, size_t count, loff_t *ppos) { //read函數(shù)中沒(méi)有數(shù)據(jù)流向用戶空間,僅是從內(nèi)核打印出讀卡流程及卡片數(shù)據(jù)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, };static int __init dev_init(void) {int ret;int i;for (i = 0; i < 5; i++) {//配置管腳的out in 模式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; }static void __exit dev_exit(void) {misc_deregister(&misc); }module_init(dev_init); module_exit(dev_exit); MODULE_LICENSE("GPL"); MODULE_AUTHOR("Song.");說(shuō)明幾點(diǎn)
flt_chr共用體中的flt本來(lái)在arm裸機(jī)下和單片機(jī)下都可以運(yùn)算,但是在micro2440的linux下浮點(diǎn)數(shù)運(yùn)算在insmod時(shí)會(huì)報(bào)__eabi之類(lèi)的錯(cuò)誤,應(yīng)該是內(nèi)核在配置時(shí)浮點(diǎn)運(yùn)算的地方?jīng)]有配置好,先不管了,將flt改成int型即可。這樣就直接將flt整型數(shù)傳給用戶空間,在用戶空間再進(jìn)行小數(shù)點(diǎn)的移動(dòng)即可。
linux2.6.32下的HZ=200,即每5ms jiffies會(huì)+1.
將驅(qū)動(dòng)insmod之后,會(huì)出現(xiàn)設(shè)備文件/dev/rfid,主設(shè)備號(hào)10,次設(shè)備號(hào)不定
首先要判斷SET_SPI_CK這些宏在linux下是否能真正起作用,否則其他都免談
一下是一個(gè)測(cè)試代碼
/********************************testrf.c**************/ #include <stdio.h> #include <unistd.h> #include <stdlib.h> #include <sys/types.h> #include <sys/stat.h> #include <sys/ioctl.h> #include <fcntl.h> #include <linux/fs.h> #include <errno.h> #include <string.h> int main(int argc,char* argv[]) { fprintf(stderr, "press Ctrl-C to stop\n"); if (argc!=2) {printf("param not correct\n");exit(1); }int fd = open("/dev/rfid", O_RDWR|O_CREAT,00100); if (fd < 0) { perror("open file "); return 1; } int len = write(fd, argv[1], strlen(argv[1])); if (len > 0) {printf("len= %d\n",len); printf("%s,%d\n",argv[1],strlen(argv[1])); } else { perror("error:"); return 1; } close(fd); } 在終端下執(zhí)行測(cè)試,比如測(cè)試cs管腳如下
[root@FriendlyARM plg]# ./testrf SET_SPI_CS press Ctrl-C to stop open_flag=1 from kernel commad=SET_SPI_CS from kenel ret=0 excuting SET_SPI_CS succes !//說(shuō)明已經(jīng)將cs腳置1,量一下如果真的是3.3V,則沒(méi)問(wèn)題 len= 10 SET_SPI_CS,10[root@FriendlyARM plg]# ./testrf CLR_SPI_CS press Ctrl-C to stop open_flag=1 from kernel commad=CLR_SPI_CS from kenel ret=0 excuting CLR_SPI_CS succes !//說(shuō)明已經(jīng)將cs腳清0,量一下如果真的是0V,則沒(méi)問(wèn)題 len= 10 CLR_SPI_CS,10 [root@FriendlyARM plg]# 其他腳都按類(lèi)似方法測(cè)試一遍


函數(shù)實(shí)現(xiàn)都在rc522.c中,
#include "rc522.h"void ClearBitMask(unsigned char reg,unsigned char mask);void WriteRawRC(unsigned char Address, unsigned char value);void SetBitMask(unsigned char reg,unsigned char mask);signed char PcdComMF522(unsigned char Command, unsigned char *pInData, unsigned char InLenByte,unsigned char *pOutData, unsigned int *pOutLenBit);void CalulateCRC(unsigned char *pIndata,unsigned char len,unsigned char *pOutData);unsigned char ReadRawRC(unsigned char Address);void PcdAntennaOn(void);/*************************************call by other file,please copy then*********************************/ 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); /*************************************call by other file*********************************/ //------------------------------------------// ?á?è?ò???byte //------------------------------------------unsigned char SPIReadByte(void){unsigned char SPICount; // Counter used to clock out the dataunsigned char SPIData; SPIData = 0;for (SPICount = 0; SPICount < 8; SPICount++) // Prepare to clock in the data to be read{SPIData <<=1; // Rotate the dataCLR_SPI_CK; ndelay(100); //spi_ck ê±Dò2ù×÷ £?ê?3?0 // Raise the clock to clock the data out of the MAX7456if(STU_SPI_MISO) //spi_miso ?áè?×?oóò???{SPIData|=0x01;}SET_SPI_CK; ndelay(100); //spi_ck ê±Dò2ù×÷ £?ê?3?1 // Drop the clock ready for the next bit} // and loop backreturn (SPIData); // Finally return the read data} //------------------------------------------// áD?è?ò???byte //------------------------------------------void SPIWriteByte(unsigned char SPIData){unsigned char SPICount; // Counter used to clock out the datafor (SPICount = 0; SPICount < 8; SPICount++){if (SPIData & 0x80){SET_SPI_MOSI; //spi_mosi D?3?ò??? }else{CLR_SPI_MOSI;} ndelay(100); //spi_ck ê±Dò2ù×÷ CLR_SPI_CK;ndelay(100); //spi_ck ê±Dò2ù×÷ £?ê?3?0SET_SPI_CK;ndelay(100); //spi_ck ê±Dò2ù×÷ £?ê?3?1SPIData <<= 1;} } ///1? ?ü£o?°??//2?êy?μ?÷: req_code[IN]:?°??·?ê?// 0x52 = ?°?Dó????ú?ùóD·?o?14443A±ê×?μ???// 0x26 = ?°????è?DY??×?ì?μ???// pTagType[OUT]£o????ààDí?ú??// 0x4400 = Mifare_UltraLight// 0x0400 = Mifare_One(S50)// 0x0200 = Mifare_One(S70)// 0x0800 = Mifare_Pro(X)// 0x4403 = Mifare_DESFire//·μ ??: 3é1?·μ??MI_OK/signed char PcdRequest(unsigned char req_code,unsigned char *pTagType){signed char status; unsigned int unLen;unsigned char ucComMF522Buf[MAXRLEN]; ClearBitMask(Status2Reg,0x08);WriteRawRC(BitFramingReg,0x07);SetBitMask(TxControlReg,0x03);ucComMF522Buf[0] = req_code;status = PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,1,ucComMF522Buf,&unLen);printk("rc522.c-PcdRequest: status = %d\n",status);if ((status == MI_OK) && (unLen == 0x10)){ *pTagType = ucComMF522Buf[0];*(pTagType+1) = ucComMF522Buf[1];}else{ status = MI_ERR; }return status;}///1? ?ü£o·à3?×2//2?êy?μ?÷: pSnr[OUT]:????DòáDo?£?4×??ú//·μ ??: 3é1?·μ??MI_OK/ signed char PcdAnticoll(unsigned char *pSnr){signed char status;unsigned char i,snr_check=0;unsigned int unLen;unsigned char ucComMF522Buf[MAXRLEN]; ClearBitMask(Status2Reg,0x08);WriteRawRC(BitFramingReg,0x00);ClearBitMask(CollReg,0x80);ucComMF522Buf[0] = PICC_ANTICOLL1;ucComMF522Buf[1] = 0x20;status = PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,2,ucComMF522Buf,&unLen);if (status == MI_OK){for (i=0; i<4; i++){ *(pSnr+i) = ucComMF522Buf[i];snr_check ^= ucComMF522Buf[i];}if (snr_check != ucComMF522Buf[i]){ status = MI_ERR; }}SetBitMask(CollReg,0x80);return status;}///1? ?ü£o????????//2?êy?μ?÷: pSnr[IN]:????DòáDo?£?4×??ú//·μ ??: 3é1?·μ??MI_OK/signed char PcdSelect(unsigned char *pSnr){signed char status;unsigned char i;unsigned int unLen;unsigned char ucComMF522Buf[MAXRLEN]; ucComMF522Buf[0] = PICC_ANTICOLL1;ucComMF522Buf[1] = 0x70;ucComMF522Buf[6] = 0;for (i=0; i<4; i++){ucComMF522Buf[i+2] = *(pSnr+i);ucComMF522Buf[6] ^= *(pSnr+i);}CalulateCRC(ucComMF522Buf,7,&ucComMF522Buf[7]);ClearBitMask(Status2Reg,0x08);status = PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,9,ucComMF522Buf,&unLen);if ((status == MI_OK) && (unLen == 0x18)){ status = MI_OK; }else{ status = MI_ERR; }return status;}///1? ?ü£o?é?€?????ü??//2?êy?μ?÷: auth_mode[IN]: ?ü???é?€?£ê?// 0x60 = ?é?€A?ü??// 0x61 = ?é?€B?ü?? // addr[IN]£o?éμ??·// pKey[IN]£o?ü??// pSnr[IN]£o????DòáDo?£?4×??ú//·μ ??: 3é1?·μ??MI_OK/ signed char PcdAuthState(unsigned char auth_mode,unsigned char addr,unsigned char *pKey,unsigned char *pSnr){signed char status;unsigned int unLen;unsigned char i,ucComMF522Buf[MAXRLEN]; ucComMF522Buf[0] = auth_mode;ucComMF522Buf[1] = addr;for (i=0; i<6; i++){ ucComMF522Buf[i+2] = *(pKey+i); }for (i=0; i<6; i++){ ucComMF522Buf[i+8] = *(pSnr+i); }// memcpy(&ucComMF522Buf[2], pKey, 6); // memcpy(&ucComMF522Buf[8], pSnr, 4); status = PcdComMF522(PCD_AUTHENT,ucComMF522Buf,12,ucComMF522Buf,&unLen);if ((status != MI_OK) || (!(ReadRawRC(Status2Reg) & 0x08))){ status = MI_ERR; }return status;}///1? ?ü£o?áè?M1??ò??éêy?Y//2?êy?μ?÷: addr[IN]£o?éμ??·// pData[OUT]£o?á3?μ?êy?Y£?16×??ú//·μ ??: 3é1?·μ??MI_OK/ signed char PcdRead(unsigned char addr,unsigned char *pData){signed char status;unsigned int unLen;unsigned char i,ucComMF522Buf[MAXRLEN]; ucComMF522Buf[0] = PICC_READ;ucComMF522Buf[1] = addr;CalulateCRC(ucComMF522Buf,2,&ucComMF522Buf[2]);status = PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,4,ucComMF522Buf,&unLen);if ((status == MI_OK) && (unLen == 0x90))// { memcpy(pData, ucComMF522Buf, 16); }{for (i=0; i<16; i++){ *(pData+i) = ucComMF522Buf[i]; }}else{ status = MI_ERR; }return status;}///1? ?ü£oD?êy?Yμ?M1??ò??é//2?êy?μ?÷: addr[IN]£o?éμ??·// pData[IN]£oD?è?μ?êy?Y£?16×??ú//·μ ??: 3é1?·μ??MI_OK/ signed char PcdWrite(unsigned char addr,unsigned char *pData){signed char status;unsigned int unLen;unsigned char i,ucComMF522Buf[MAXRLEN]; ucComMF522Buf[0] = PICC_WRITE;ucComMF522Buf[1] = addr;CalulateCRC(ucComMF522Buf,2,&ucComMF522Buf[2]);status = PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,4,ucComMF522Buf,&unLen);if ((status != MI_OK) || (unLen != 4) || ((ucComMF522Buf[0] & 0x0F) != 0x0A)){ status = MI_ERR; }if (status == MI_OK){//memcpy(ucComMF522Buf, pData, 16);for (i=0; i<16; i++){ ucComMF522Buf[i] = *(pData+i); }CalulateCRC(ucComMF522Buf,16,&ucComMF522Buf[16]);status = PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,18,ucComMF522Buf,&unLen);if ((status != MI_OK) || (unLen != 4) || ((ucComMF522Buf[0] & 0x0F) != 0x0A)){ status = MI_ERR; }}return status;}///1? ?ü£o?üá???????è?DY??×?ì?//·μ ??: 3é1?·μ??MI_OK/signed char PcdHalt(void){signed char status;unsigned int unLen;unsigned char ucComMF522Buf[MAXRLEN]; ucComMF522Buf[0] = PICC_HALT;ucComMF522Buf[1] = 0;CalulateCRC(ucComMF522Buf,2,&ucComMF522Buf[2]);status = PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,4,ucComMF522Buf,&unLen);return MI_OK;}///ó?MF522????CRC16oˉêy/void CalulateCRC(unsigned char *pIndata,unsigned char len,unsigned char *pOutData){unsigned char i,n;ClearBitMask(DivIrqReg,0x04);WriteRawRC(CommandReg,PCD_IDLE);SetBitMask(FIFOLevelReg,0x80);for (i=0; i<len; i++){ WriteRawRC(FIFODataReg, *(pIndata+i)); }WriteRawRC(CommandReg, PCD_CALCCRC);i = 0xFF;do {n = ReadRawRC(DivIrqReg);i--;}while ((i!=0) && !(n&0x04));pOutData[0] = ReadRawRC(CRCResultRegL);pOutData[1] = ReadRawRC(CRCResultRegM);}///1? ?ü£o????RC522//·μ ??: 3é1?·μ??MI_OK/signed char PcdReset(void){//PORTD|=(1<<RC522RST);SET_RC522RST;ndelay(100); /******************************************************************delay_ns********************************///PORTD&=~(1<<RC522RST);CLR_RC522RST;ndelay(100); //PORTD|=(1<<RC522RST);SET_RC522RST;ndelay(100); WriteRawRC(CommandReg,PCD_RESETPHASE);ndelay(100); WriteRawRC(ModeReg,0x3D); //oíMifare??í???£?CRC3?ê??μ0x6363WriteRawRC(TReloadRegL,30); WriteRawRC(TReloadRegH,0);WriteRawRC(TModeReg,0x8D);WriteRawRC(TPrescalerReg,0x3E);WriteRawRC(TxAutoReg,0x40);//±?D?òareturn MI_OK;}////éè??RC632μ?1€×÷·?ê? //signed char M500PcdConfigISOType(unsigned char type){if (type == 'A') //ISO14443_A{ ClearBitMask(Status2Reg,0x08);WriteRawRC(ModeReg,0x3D);//3FWriteRawRC(RxSelReg,0x86);//84WriteRawRC(RFCfgReg,0x7F); //4FWriteRawRC(TReloadRegL,30);//tmoLength);// TReloadVal = 'h6a =tmoLength(dec) WriteRawRC(TReloadRegH,0);WriteRawRC(TModeReg,0x8D);WriteRawRC(TPrescalerReg,0x3E);ndelay(100); PcdAntennaOn();}else{ return -1; }return MI_OK;}//?áD??????÷///1? ?ü£o?áRC632?????÷//2?êy?μ?÷£oAddress[IN]:?????÷μ??·//·μ ??£o?á3?μ??μ/unsigned char ReadRawRC(unsigned char Address){unsigned char ucAddr;unsigned char ucResult=0;CLR_SPI_CS;ucAddr = ((Address<<1)&0x7E)|0x80;SPIWriteByte(ucAddr);ucResult=SPIReadByte();SET_SPI_CS;return ucResult;}///1? ?ü£oD?RC632?????÷//2?êy?μ?÷£oAddress[IN]:?????÷μ??·// value[IN]:D?è?μ??μ/void WriteRawRC(unsigned char Address, unsigned char value){ unsigned char ucAddr;CLR_SPI_CS;ucAddr = ((Address<<1)&0x7E);SPIWriteByte(ucAddr);SPIWriteByte(value);SET_SPI_CS;}//?±?óμ÷ó??áD??????÷μ?oˉêy??DD2ù×÷?????÷£??aD?oˉêyó?±?????oˉêyμ÷ó?êμ???÷??1??ü///1? ?ü£o??RC522?????÷??//2?êy?μ?÷£oreg[IN]:?????÷μ??·// mask[IN]:?????μ/void SetBitMask(unsigned char reg,unsigned char mask) {signed char tmp = 0x0;tmp = ReadRawRC(reg);WriteRawRC(reg,tmp | mask); // set bit mask}///1? ?ü£o??RC522?????÷??//2?êy?μ?÷£oreg[IN]:?????÷μ??·// mask[IN]:?????μ/void ClearBitMask(unsigned char reg,unsigned char mask) {signed char tmp = 0x0;tmp = ReadRawRC(reg);WriteRawRC(reg, tmp & ~mask); // clear bit mask} ///1? ?ü£oí?1yRC522oíISO14443??í??? £?í?1yéè??commandregμ??μè?pcd??DD2?í?μ??üá?£?à?ó?picc??μYêy?Y//2?êy?μ?÷£oCommand[IN]:RC522?üá?×?// pInData[IN]:í?1yRC522·¢?íμ?????μ?êy?Y// InLenByte[IN]:·¢?íêy?Yμ?×??ú3€?è// pOutData[OUT]:?óê?μ?μ?????·μ??êy?Y// *pOutLenBit[OUT]:·μ??êy?Yμ???3€?è/signed char PcdComMF522(unsigned char Command, unsigned char *pInData, unsigned char InLenByte,unsigned char *pOutData, unsigned int *pOutLenBit){signed char status = MI_ERR;unsigned char irqEn = 0x00;unsigned char waitFor = 0x00;unsigned char lastBits;unsigned char n;unsigned int i;switch (Command){case PCD_AUTHENT:irqEn = 0x12;waitFor = 0x10;break;case PCD_TRANSCEIVE:irqEn = 0x77;waitFor = 0x30;break;default:break;}WriteRawRC(ComIEnReg,irqEn|0x80);ClearBitMask(ComIrqReg,0x80);WriteRawRC(CommandReg,PCD_IDLE);SetBitMask(FIFOLevelReg,0x80);for (i=0; i<InLenByte; i++){ WriteRawRC(FIFODataReg, pInData[i]); }WriteRawRC(CommandReg, Command);if (Command == PCD_TRANSCEIVE){ SetBitMask(BitFramingReg,0x80); }//i = 600;//?ù?Yê±?ó?μ?êμ÷??£?2ù×÷M1??×??óμè?yê±??25msi = 200000000; //mcuò??-???üá?×?D?è?rc522μ?commandreg,2?êyD?è?á?FIFODataReg£?rc522?y?ú??DDcommandregà?μ??üá??ómifare???Dè?μ??àó?μ?êy?Y£?//?úrc522?1??è?μ?êy?Yμ?ê±oò£?mcuμè?yò???,×??à??Dèμè?y25ms£???oó//mcu?ùè¥?áè?rc522μ?FIFODataReg???é?áμ? .è?1??úò??????ìμ?mcu?D£??éò????ói?μ£?ò?ê1μè?yê±???ó3€ò?μ?£?·??ò?é?ü?áè?ê§°ü?£do {n = ReadRawRC(ComIrqReg);i--;}while ((i!=0) && !(n&0x01) && !(n&waitFor));ClearBitMask(BitFramingReg,0x80);if (i!=0){ if(!(ReadRawRC(ErrorReg)&0x1B)){status = MI_OK;if (n & irqEn & 0x01){ status = MI_NOTAGERR; }if (Command == PCD_TRANSCEIVE){n = ReadRawRC(FIFOLevelReg);lastBits = ReadRawRC(ControlReg) & 0x07;if (lastBits){ *pOutLenBit = (n-1)*8 + lastBits; }else{ *pOutLenBit = n*8; }if (n == 0){ n = 1; }if (n > MAXRLEN){ n = MAXRLEN; }for (i=0; i<n; i++){ pOutData[i] = ReadRawRC(FIFODataReg); }}}else{ status = MI_ERR; }}SetBitMask(ControlReg,0x80); // stop timer nowWriteRawRC(CommandReg,PCD_IDLE); return status;}///?a??ìì?? //???????ˉ?ò1?±?ìì??·¢é?????ó??áéùóD1msμ?????/void PcdAntennaOn(void){unsigned char i;i = ReadRawRC(TxControlReg);if (!(i & 0x03)){SetBitMask(TxControlReg, 0x03);}}///1?±?ìì??/void PcdAntennaOff(void){ClearBitMask(TxControlReg, 0x03);}///1? ?ü£o????oí3??μ//2?êy?μ?÷: dd_mode[IN]£o?üá?×?// 0xC0 = ????// 0xC1 = 3??μ// addr[IN]£o??°üμ??·// pValue[IN]£o4×??ú??(??)?μ£?μí???ú?°//·μ ??: 3é1?·μ??MI_OK/ /*signed char PcdValue(unsigned char dd_mode,unsigned char addr,unsigned char *pValue){signed char status;unsigned int unLen;unsigned char ucComMF522Buf[MAXRLEN]; //unsigned char i;ucComMF522Buf[0] = dd_mode;ucComMF522Buf[1] = addr;CalulateCRC(ucComMF522Buf,2,&ucComMF522Buf[2]);status = PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,4,ucComMF522Buf,&unLen);if ((status != MI_OK) || (unLen != 4) || ((ucComMF522Buf[0] & 0x0F) != 0x0A)){ status = MI_ERR; }if (status == MI_OK){memcpy(ucComMF522Buf, pValue, 4);//for (i=0; i<16; i++)//{ ucComMF522Buf[i] = *(pValue+i); }CalulateCRC(ucComMF522Buf,4,&ucComMF522Buf[4]);unLen = 0;status = PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,6,ucComMF522Buf,&unLen);if (status != MI_ERR){ status = MI_OK; }}if (status == MI_OK){ucComMF522Buf[0] = PICC_TRANSFER;ucComMF522Buf[1] = addr;CalulateCRC(ucComMF522Buf,2,&ucComMF522Buf[2]); status = PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,4,ucComMF522Buf,&unLen);if ((status != MI_OK) || (unLen != 4) || ((ucComMF522Buf[0] & 0x0F) != 0x0A)){ status = MI_ERR; }}return status;}*////1? ?ü£o±?·Y??°ü//2?êy?μ?÷: sourceaddr[IN]£o??μ??·// goaladdr[IN]£o??±êμ??·//·μ ??: 3é1?·μ??MI_OK//*signed char PcdBakValue(unsigned char sourceaddr, unsigned char goaladdr){signed char status;unsigned int unLen;unsigned char ucComMF522Buf[MAXRLEN]; ucComMF522Buf[0] = PICC_RESTORE;ucComMF522Buf[1] = sourceaddr;CalulateCRC(ucComMF522Buf,2,&ucComMF522Buf[2]);status = PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,4,ucComMF522Buf,&unLen);if ((status != MI_OK) || (unLen != 4) || ((ucComMF522Buf[0] & 0x0F) != 0x0A)){ status = MI_ERR; }if (status == MI_OK){ucComMF522Buf[0] = 0;ucComMF522Buf[1] = 0;ucComMF522Buf[2] = 0;ucComMF522Buf[3] = 0;CalulateCRC(ucComMF522Buf,4,&ucComMF522Buf[4]);status = PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,6,ucComMF522Buf,&unLen);if (status != MI_ERR){ status = MI_OK; }}if (status != MI_OK){ return MI_ERR; }ucComMF522Buf[0] = PICC_TRANSFER;ucComMF522Buf[1] = goaladdr;CalulateCRC(ucComMF522Buf,2,&ucComMF522Buf[2]);status = PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,4,ucComMF522Buf,&unLen);if ((status != MI_OK) || (unLen != 4) || ((ucComMF522Buf[0] & 0x0F) != 0x0A)){ status = MI_ERR; }return status;}*/說(shuō)明

頭文件rc522.h
#ifndef _RC522_H_ #define _RC522_H_ #include <linux/miscdevice.h> #include <linux/delay.h> #include <asm/irq.h> #include <mach/regs-gpio.h> #include <mach/hardware.h> #include <linux/kernel.h> #include <linux/module.h> #include <linux/init.h> #include <linux/mm.h> #include <linux/fs.h> #include <linux/types.h> #include <linux/time.h> #include <linux/timer.h> #include <linux/moduleparam.h> #include <linux/slab.h> #include <linux/errno.h> #include <linux/ioctl.h> #include <linux/cdev.h> #include <linux/string.h> #include <linux/list.h> #include <linux/pci.h> #include <linux/gpio.h> #include <asm/uaccess.h> #include <asm/atomic.h> #include <asm/unistd.h>///MF522?üá?×? ò?°?ê?D?è?rc522μ?commandreg£?rc522è?ê??a???üá??ú??£??éò???DD??????????êêμ±2ù×÷/#define PCD_IDLE 0x00 //è???μ±?°?üá?#define PCD_AUTHENT 0x0E //?é?€?ü??#define PCD_RECEIVE 0x08 //?óê?êy?Y#define PCD_TRANSMIT 0x04 //·¢?íêy?Y#define PCD_TRANSCEIVE 0x0C //·¢?í2¢?óê?êy?Y#define PCD_RESETPHASE 0x0F //????#define PCD_CALCCRC 0x03 //CRC????///Mifare_One?????üá?×?£?ò?°?ê?D?è?rc522μ?FIFODataReg?D£?rc522×??ˉ?????1è?fifo,?aD??üá?×?mifare??è?ê?£??éò???DD??£?ò??ìó?rc522//mcu?ú??MF522?üá?×?D?è?commandreg???°£?ó??è°?Mifare_One?????üá?×?oí???üá?×?Dèòaμ?????2?êy°???????μ???ê?D?è?FIFODataReg//£?òò?aò?μ?commandreg?DóD?üá?rc522?í?á??DD£?2¢?òμ?fifo//?D?°?ò2?êy£??ùò???2?êyó????è·?μ?fifo?D?£//Mifare_One?????üá?×?ò?°?ê??úmain.c?Dóéoˉêy2?êy?±?ó????£?±íê?òa??????DDê2???ˉ×÷£???êμ?êé?òa??????DDê2???ˉ×÷£???óDrc5222??üè¥???üá?£?//main.c?Dμ÷ó?μ???ê?/#define PICC_REQIDL 0x26 //?°ìì?????ú????è?DY??×?ì?#define PICC_REQALL 0x52 //?°ìì?????úè?2???#define PICC_ANTICOLL1 0x93 //·à3?×2#define PICC_ANTICOLL2 0x95 //·à3?×2#define PICC_AUTHENT1A 0x60 //?é?€A?ü??#define PICC_AUTHENT1B 0x61 //?é?€B?ü??#define PICC_READ 0x30 //?á?é#define PICC_WRITE 0xA0 //D??é#define PICC_DECREMENT 0xC0 //????#define PICC_INCREMENT 0xC1 //3??μ#define PICC_RESTORE 0xC2 //μ÷?éêy?Yμ??o3???#define PICC_TRANSFER 0xB0 //±£???o3????Dêy?Y#define PICC_HALT 0x50 //DY??///MF522 FIFO3€?è??ò?/#define DEF_FIFO_LENGTH 64 //FIFO size=64byte#define MAXRLEN 18///MF522?????÷??ò?/// PAGE 0#define RFU00 0x00 #define CommandReg 0x01 #define ComIEnReg 0x02 #define DivlEnReg 0x03 #define ComIrqReg 0x04 #define DivIrqReg 0x05#define ErrorReg 0x06 #define Status1Reg 0x07 #define Status2Reg 0x08 #define FIFODataReg 0x09#define FIFOLevelReg 0x0A#define WaterLevelReg 0x0B#define ControlReg 0x0C#define BitFramingReg 0x0D#define CollReg 0x0E#define RFU0F 0x0F// PAGE 1 #define RFU10 0x10#define ModeReg 0x11#define TxModeReg 0x12#define RxModeReg 0x13#define TxControlReg 0x14#define TxAutoReg 0x15#define TxSelReg 0x16#define RxSelReg 0x17#define RxThresholdReg 0x18#define DemodReg 0x19#define RFU1A 0x1A#define RFU1B 0x1B#define MifareReg 0x1C#define RFU1D 0x1D#define RFU1E 0x1E#define SerialSpeedReg 0x1F// PAGE 2 #define RFU20 0x20 #define CRCResultRegM 0x21#define CRCResultRegL 0x22#define RFU23 0x23#define ModWidthReg 0x24#define RFU25 0x25#define RFCfgReg 0x26#define GsNReg 0x27#define CWGsCfgReg 0x28#define ModGsCfgReg 0x29#define TModeReg 0x2A#define TPrescalerReg 0x2B#define TReloadRegH 0x2C#define TReloadRegL 0x2D#define TCounterValueRegH 0x2E#define TCounterValueRegL 0x2F// PAGE 3 #define RFU30 0x30#define TestSel1Reg 0x31#define TestSel2Reg 0x32#define TestPinEnReg 0x33#define TestPinValueReg 0x34#define TestBusReg 0x35#define AutoTestReg 0x36#define VersionReg 0x37#define AnalogTestReg 0x38#define TestDAC1Reg 0x39 #define TestDAC2Reg 0x3A #define TestADCReg 0x3B #define RFU3C 0x3C #define RFU3D 0x3D #define RFU3E 0x3E #define RFU3F 0x3F///oíMF522í???ê±·μ??μ??í?ó?ú??/#define MI_OK 0#define MI_NOTAGERR (-1)#define MI_ERR (-2)#define SHAQU1 0X01#define KUAI4 0X04#define KUAI7 0X07#define REGCARD 0xa1#define CONSUME 0xa2#define READCARD 0xa3#define ADDMONEY 0xa4/*sbit spi_cs=P0^5;sbit spi_ck=P0^6;sbit spi_mosi=P0^7;sbit spi_miso=P4^1;sbit spi_rst=P2^7;#define SET_SPI_CS spi_cs=1#define CLR_SPI_CS spi_cs=0#define SET_SPI_CK spi_ck=1#define CLR_SPI_CK spi_ck=0#define SET_SPI_MOSI spi_mosi=1#define CLR_SPI_MOSI spi_mosi=0#define STU_SPI_MISO spi_miso#define SET_RC522RST spi_rst=1#define CLR_RC522RST spi_rst=0*/extern unsigned long rfid_table[] ; extern unsigned long rfid_table[] ;#define SET_SPI_CS (s3c2410_gpio_setpin(rfid_table[0], 1)) //??????ê?3?1£?gpfdat bit0=1#define CLR_SPI_CS (s3c2410_gpio_setpin(rfid_table[0], 0)) //??????ê?3?0, gpfdat bit0=0#define SET_SPI_CK (s3c2410_gpio_setpin(rfid_table[1], 1)) //ê±?ó??ê?3?1£?gpfdat bit1=1#define CLR_SPI_CK (s3c2410_gpio_setpin(rfid_table[1], 0)) //ê±?ó??ê?3?0, gpfdat bit1=0#define SET_SPI_MOSI (s3c2410_gpio_setpin(rfid_table[2], 1)) //?÷?úmosi??ê?3?1£?gpfdat bit2=1#define CLR_SPI_MOSI (s3c2410_gpio_setpin(rfid_table[2], 0)) //?÷?úmosi??ê?3?0, gpfdat bit2=0#define STU_SPI_MISO (s3c2410_gpio_getpin(rfid_table[3])) //è?miso??ò???êy?Y £?gpfdat bit3#define SET_RC522RST (s3c2410_gpio_setpin(rfid_table[4], 1)) //??????ê?3?1£?gpfdat bit4=1#define CLR_RC522RST (s3c2410_gpio_setpin(rfid_table[4], 1)) //??????ê?3?0, gpfdat bit4=0 #endif最后這幾行,宏SET_SPI_CS的實(shí)現(xiàn)用的是內(nèi)核提供的函數(shù)s3c2410_gpio_setpin(),和單片機(jī),裸機(jī)arm上的實(shí)現(xiàn)都不一樣

最后是Makefile
ifneq ($(KERNELRELEASE),) obj-m:= mymodule.o mymodule-objs := rfid.o rc522.o else KDIR := /opt/FriendlyARM/mini2440/linux-2.6.32.2 all: make -C $(KDIR) M=$(PWD) modules clean: rm -f *.ko *.o *.mod.o *.mod.c *.symvers *~ modules.order endif
現(xiàn)在可以讀卡了,將卡放在rfid小板上面,用cat即可測(cè)試,內(nèi)核會(huì)打印出卡得內(nèi)容
[root@FriendlyARM plg]# cat /dev/rfid open_flag=1 read_rfid1HZ=200 rc522.c-PcdRequest: status = 0 *********** discard card typr ***********dicover card serial num 2e65d2c7*********** selected card *********** right password *********** the first reading card success,as follows fltchr.chr[0]=9c fltchr.chr[1]=0 fltchr.chr[2]=0 fltchr.chr[3]=0 fltchr.flt=156//卡中塊4數(shù)據(jù) *********** write card with the data as follows //將數(shù)據(jù)+6,再寫(xiě)入 fltchr.flt=162 fltchr.chr[0]=a2 fltchr.chr[1]=0 fltchr.chr[2]=0 fltchr.chr[3]=0 Write_First_Data[0]=a2 Write_First_Data[1]=0 Write_First_Data[2]=0 Write_First_Data[3]=0 *********** write to card success with the data above *********** the first reading card success,as follows fltchr.chr[0]=a2 fltchr.chr[1]=0 fltchr.chr[2]=0 fltchr.chr[3]=0 fltchr.flt=162//卡中塊4數(shù)據(jù) read_rfid2

/********************************************************************************************************************************************************/
misc驅(qū)動(dòng)的簡(jiǎn)單案例,僅支持一次性open read write close,不支持lseek mmap ioctl等,但這樣更好調(diào)試。
? “先搭框架!逐步擴(kuò)充!由簡(jiǎn)到繁!最后完善" 邊編程!邊調(diào)試!邊擴(kuò)充" 千萬(wàn)不要企圖在一開(kāi)始時(shí)就解決所有的細(xì)節(jié)" 類(lèi)是可擴(kuò)充的!可以一步一步地?cái)U(kuò)充它的功能" 最好直接在計(jì)算機(jī)上寫(xiě)程序!每一步都要上機(jī)調(diào)試!調(diào)試通過(guò)了前面一步再做下一步!步步為營(yíng)" 這樣編程和調(diào)試的效率是比較高的" p134
/********************************misc_test.c**************/ #include <linux/miscdevice.h> #include <linux/delay.h> #include <asm/irq.h> #include <linux/kernel.h> #include <linux/module.h> #include <linux/init.h> #include <linux/mm.h> #include <linux/fs.h> #include <linux/types.h> #include <linux/time.h> #include <linux/timer.h> #include <linux/moduleparam.h> #include <linux/slab.h> #include <linux/errno.h> #include <linux/ioctl.h> #include <linux/cdev.h> #include <linux/string.h> #include <linux/list.h> #include <linux/gpio.h> #include <asm/uaccess.h> #include <asm/atomic.h> #include <asm/unistd.h> #define DEBUG #ifdef DEBUG #define DBG(...) printk(" DBG(%s, %s(), %d): ", __FILE__, __FUNCTION__, __LINE__); printk(__VA_ARGS__) #else #define DBG(...) #endif #define DEVICE_NAME "misc_test_dev" int ret; #define NUM_BYTES 32 ssize_t misc_write(struct file *filp, const char __user *buf, size_t count, loff_t *f_pos) { char *kbuf=kmalloc(count+1,GFP_KERNEL);//need print it using %s, so plus 1 byte for '\0' if (count == 0) return count; DBG("to copy from user %d bytes\n", count);ret = copy_from_user(kbuf, buf, count);//buf->kbuf,if success,ret=0 DBG("copied %d bytes of %s\n", count-ret,kbuf);kfree(kbuf);return count-ret; //return the bytes quantity have copied } ssize_t misc_read(struct file *filp, char __user *buf, size_t count, loff_t *f_pos) { char *kbuf=kmalloc(NUM_BYTES,GFP_KERNEL);if (count == 0) return count; kbuf="hello evryone";DBG("to copy to user %d bytes\n", count);ret = copy_to_user(buf, kbuf, count);//kbuf->buf,if success,ret=0 DBG("copied %d bytes of %s\n", count-ret,kbuf);kfree(kbuf);return count-ret ; //return the bytes quantity have copied } static int misc_release(struct inode *inode, struct file *filp) { DBG("release \n"); return 0; } static int misc_open(struct inode *inode, struct file *filp) { DBG("open \n"); return 0; } static struct file_operations dev_fops = { .owner = THIS_MODULE, .open = misc_open, .read = misc_read, .write = misc_write, .release= misc_release, }; static struct miscdevice misc = { .minor = MISC_DYNAMIC_MINOR, .name = DEVICE_NAME, .fops = &dev_fops, }; static int __init dev_init(void) { int ret; ret = misc_register(&misc); DBG (DEVICE_NAME"\tinit\n"); return ret; } static void __exit dev_exit(void) { DBG (DEVICE_NAME"\texit\n"); misc_deregister(&misc); } module_init(dev_init); module_exit(dev_exit); MODULE_LICENSE("GPL"); MODULE_AUTHOR("Song."); Makefile
ifneq ($(KERNELRELEASE),) obj-m := misc_test.o else KDIR := /opt/FriendlyARM/mini2440/linux-2.6.32.2 #KDIR := /lib/modules/$(uname-r)*/build/ all: make -C $(KDIR) M=$(PWD) modules clean: rm -f *.ko *.o *.mod.o *.mod.c *.symvers endif 注意:
驅(qū)動(dòng)中的copy_to _user和copy_from_user返回的都是未能拷貝的字節(jié)數(shù)。當(dāng)然返回0就是所有數(shù)據(jù)拷貝成功。
而系統(tǒng)調(diào)用read對(duì)應(yīng)copy_to _user ,一般協(xié)定read是返回的成功讀到的字節(jié)數(shù)。所以在驅(qū)動(dòng)的read實(shí)現(xiàn)中不能將copy_to _user 返回值直接返回給用戶。而是要處理一下,使返回成功拷貝的字節(jié)數(shù)。當(dāng)然如果你非要直接返回,那么在app的read調(diào)用中對(duì)返回值的處理要根據(jù)驅(qū)動(dòng)中read的具體實(shí)現(xiàn)改變一下。
write對(duì)應(yīng)copy_from_user,同理。
/********************************read_app.c**************/ #include <stdio.h> #include <unistd.h> #include <stdlib.h> #include <sys/types.h> #include <sys/stat.h> #include <sys/ioctl.h> #include <fcntl.h> #include <linux/fs.h> #include <errno.h> #include <string.h> #define DEBUG #ifdef DEBUG #define DBG(...) fprintf(stderr, " DBG(%s, %s(), %d): ", __FILE__, __FUNCTION__, __LINE__); fprintf(stderr, __VA_ARGS__) #else #define DBG(...) #endif #define NUM_BYTES 32 int main(int argc,char* argv[]) { DBG("press Ctrl-C to stop\n"); int fd = open(argv[1], 0); if (fd < 0) { perror("open file "); return 1; } char *buffer=malloc(NUM_BYTES); int i; DBG("to read : %d bytes \n", NUM_BYTES); int len = read(fd, buffer, NUM_BYTES); if (len >=0) { DBG("return : %d bytes \n", len); } else { perror("error:"); return 1; } for(i=0;i<NUM_BYTES;i++) { DBG("%c\n",buffer[i]); } free(buffer); close(fd); }
/********************************write_app.c**************/ #include <stdio.h> #include <unistd.h> #include <stdlib.h> #include <sys/types.h> #include <sys/stat.h> #include <sys/ioctl.h> #include <fcntl.h> #include <linux/fs.h> #include <errno.h> #include <string.h> #define DEBUG #ifdef DEBUG #define DBG(...) fprintf(stderr, " DBG(%s, %s(), %d): ", __FILE__, __FUNCTION__, __LINE__); fprintf(stderr, __VA_ARGS__) #else #define DBG(...) #endif #define NUM_BYTES 32 int main(int argc,char* argv[]) { fprintf(stderr, "press Ctrl-C to stop\n"); int fd = open(argv[1], O_RDWR|O_CREAT,00100); //if the file does not exsit,then creat //else open if (fd < 0) { perror("open file "); return 1; } DBG("to write : %d bytes of %s\n", strlen(argv[2]),argv[2]); int len = write(fd, argv[2], strlen(argv[2])); if (len >= 0) { DBG("return : %d bytes \n", len); } else { perror("error:"); return 1; } close(fd); } 一下是測(cè)試結(jié)果:
[root@FriendlyARM plg]# insmod misc_test.ko //insmodDBG(/opt/misc/misc_test.c, dev_init(), 94): misc_test_dev init [root@FriendlyARM plg]# chmod +x read_app [root@FriendlyARM plg]# chmod +x write_app [root@FriendlyARM plg]# ./read_app /dev/misc_test_dev //readDBG(read_app.c, main(), 22): press Ctrl-C to stop DBG(/opt/misc/misc_test.c, misc_open(), 71): open DBG(/opt/misc/misc_test.c, misc_read(), 53): to copy to user 32 bytesDBG(/opt/misc/misc_test.c, misc_read(), 56): copied 32 bytes of hello evryoneDBG(/opt/misc/misc_test.c, misc_release(), 65): release DBG(read_app.c, main(), 30): to read : 32 bytes DBG(read_app.c, main(), 33): return : 32 bytes DBG(read_app.c, main(), 40): hDBG(read_app.c, main(), 40): eDBG(read_app.c, main(), 40): lDBG(read_app.c, main(), 40): lDBG(read_app.c, main(), 40): oDBG(read_app.c, main(), 40): DBG(read_app.c, main(), 40): eDBG(read_app.c, main(), 40): vDBG(read_app.c, main(), 40): rDBG(read_app.c, main(), 40): yDBG(read_app.c, main(), 40): oDBG(read_app.c, main(), 40): nDBG(read_app.c, main(), 40): eDBG(read_app.c, main(), 40): DBG(read_app.c, main(), 40): DBG(read_app.c, main(), 40): DBG(read_app.c, main(), 40): cDBG(read_app.c, main(), 40): oDBG(read_app.c, main(), 40): pDBG(read_app.c, main(), 40): iDBG(read_app.c, main(), 40): eDBG(read_app.c, main(), 40): dDBG(read_app.c, main(), 40): DBG(read_app.c, main(), 40): %DBG(read_app.c, main(), 40): dDBG(read_app.c, main(), 40): DBG(read_app.c, main(), 40): bDBG(read_app.c, main(), 40): yDBG(read_app.c, main(), 40): tDBG(read_app.c, main(), 40): eDBG(read_app.c, main(), 40): sDBG(read_app.c, main(), 40): [root@FriendlyARM plg]# ./write_app? /dev/misc_test_dev? hello?? ?//write press Ctrl-C to stopDBG(/opt/misc/misc_test.c, misc_open(), 71): open DBG(/opt/misc/misc_test.c, misc_write(), 40): to copy from user 5 bytesDBG(/opt/misc/misc_test.c, misc_write(), 43): copied 5 bytes of hello2.9.soDBG(/opt/misc/misc_test.c, misc_release(), 65): release DBG(write_app.c, main(), 30): to write : 5 bytes of helloDBG(write_app.c, main(), 33): return : 5 bytes [root@FriendlyARM plg]# rmmod misc_test //remove DBG(/opt/misc/misc_test.c, dev_exit(), 100): misc_test_dev exit rmmod: module 'misc_test' not found

http://download.csdn.net/detail/songqqnew/3716589

轉(zhuǎn)載于:https://www.cnblogs.com/-song/archive/2011/10/23/3331943.html

總結(jié)

以上是生活随笔為你收集整理的rfid3-micro2440,linux2.6.32.2,写成misc驱动的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。