码迷,mamicode.com
首页 > 系统相关 > 详细

linux 驱动cc1101

时间:2015-04-07 11:43:47      阅读:331      评论:0      收藏:0      [点我收藏+]

标签:

cc1101.h:

  1. #ifndef _CC1101_H  
  2. #define _CC1101_H  
  3.   
  4. #define     INT8U   unsigned char  
  5. #define     INT16U  unsigned int  
  6.   
  7. #define     WRITE_BURST         0x40                        //连续写入  
  8. #define     READ_SINGLE         0x80                        //读  
  9. #define     READ_BURST          0xC0                        //连续读  
  10. #define     BYTES_IN_RXFIFO     0x7F                        //接收缓冲区的有效字节数  
  11. #define     CRC_OK              0x80                        //CRC校验通过位标志  
  12. #define CCxxx0_IOCFG2       0x00        // GDO2 output pin configuration  
  13. #define CCxxx0_IOCFG1       0x01        // GDO1 output pin configuration  
  14. #define CCxxx0_IOCFG0       0x02        // GDO0 output pin configuration  
  15. #define CCxxx0_FIFOTHR      0x03        // RX FIFO and TX FIFO thresholds  
  16. #define CCxxx0_SYNC1        0x04        // Sync word, high INT8U  
  17. #define CCxxx0_SYNC0        0x05        // Sync word, low INT8U  
  18. #define CCxxx0_PKTLEN       0x06        // Packet length  
  19. #define CCxxx0_PKTCTRL1     0x07        // Packet automation control  
  20. #define CCxxx0_PKTCTRL0     0x08        // Packet automation control  
  21. #define CCxxx0_ADDR         0x09        // Device address  
  22. #define CCxxx0_CHANNR       0x0A        // Channel number  
  23. #define CCxxx0_FSCTRL1      0x0B        // Frequency synthesizer control  
  24. #define CCxxx0_FSCTRL0      0x0C        // Frequency synthesizer control  
  25. #define CCxxx0_FREQ2        0x0D        // Frequency control word, high INT8U  
  26. #define CCxxx0_FREQ1        0x0E        // Frequency control word, middle INT8U  
  27. #define CCxxx0_FREQ0        0x0F        // Frequency control word, low INT8U  
  28. #define CCxxx0_MDMCFG4      0x10        // Modem configuration  
  29. #define CCxxx0_MDMCFG3      0x11        // Modem configuration  
  30. #define CCxxx0_MDMCFG2      0x12        // Modem configuration  
  31. #define CCxxx0_MDMCFG1      0x13        // Modem configuration  
  32. #define CCxxx0_MDMCFG0      0x14        // Modem configuration  
  33. #define CCxxx0_DEVIATN      0x15        // Modem deviation setting  
  34. #define CCxxx0_MCSM2        0x16        // Main Radio Control State Machine configuration  
  35. #define CCxxx0_MCSM1        0x17        // Main Radio Control State Machine configuration  
  36. #define CCxxx0_MCSM0        0x18        // Main Radio Control State Machine configuration  
  37. #define CCxxx0_FOCCFG       0x19        // Frequency Offset Compensation configuration  
  38. #define CCxxx0_BSCFG        0x1A        // Bit Synchronization configuration  
  39. #define CCxxx0_AGCCTRL2     0x1B        // AGC control  
  40. #define CCxxx0_AGCCTRL1     0x1C        // AGC control  
  41. #define CCxxx0_AGCCTRL0     0x1D        // AGC control  
  42. #define CCxxx0_WOREVT1      0x1E        // High INT8U Event 0 timeout  
  43. #define CCxxx0_WOREVT0      0x1F        // Low INT8U Event 0 timeout  
  44. #define CCxxx0_WORCTRL      0x20        // Wake On Radio control  
  45. #define CCxxx0_FREND1       0x21        // Front end RX configuration  
  46. #define CCxxx0_FREND0       0x22        // Front end TX configuration  
  47. #define CCxxx0_FSCAL3       0x23        // Frequency synthesizer calibration  
  48. #define CCxxx0_FSCAL2       0x24        // Frequency synthesizer calibration  
  49. #define CCxxx0_FSCAL1       0x25        // Frequency synthesizer calibration  
  50. #define CCxxx0_FSCAL0       0x26        // Frequency synthesizer calibration  
  51. #define CCxxx0_RCCTRL1      0x27        // RC oscillator configuration  
  52. #define CCxxx0_RCCTRL0      0x28        // RC oscillator configuration  
  53. #define CCxxx0_FSTEST       0x29        // Frequency synthesizer calibration control  
  54. #define CCxxx0_PTEST        0x2A        // Production test  
  55. #define CCxxx0_AGCTEST      0x2B        // AGC test  
  56. #define CCxxx0_TEST2        0x2C        // Various test settings  
  57. #define CCxxx0_TEST1        0x2D        // Various test settings  
  58. #define CCxxx0_TEST0        0x2E        // Various test settings  
  59.   
  60. // Strobe commands  
  61. #define CCxxx0_SRES         0x30        // Reset chip.  
  62. #define CCxxx0_SFSTXON      0x31        // Enable and calibrate frequency synthesizer (if MCSM0.FS_AUTOCAL=1).  
  63. // If in RX/TX: Go to a wait state where only the synthesizer is  
  64. // running (for quick RX / TX turnaround).  
  65. #define CCxxx0_SXOFF        0x32        // Turn off crystal oscillator.  
  66. #define CCxxx0_SCAL         0x33        // Calibrate frequency synthesizer and turn it off  
  67. // (enables quick start).  
  68. #define CCxxx0_SRX          0x34        // Enable RX. Perform calibration first if coming from IDLE and  
  69. // MCSM0.FS_AUTOCAL=1.  
  70. #define CCxxx0_STX          0x35        // In IDLE state: Enable TX. Perform calibration first if  
  71. // MCSM0.FS_AUTOCAL=1. If in RX state and CCA is enabled:  
  72. // Only go to TX if channel is clear.  
  73. #define CCxxx0_SIDLE        0x36        // Exit RX / TX, turn off frequency synthesizer and exit  
  74. // Wake-On-Radio mode if applicable.  
  75. #define CCxxx0_SAFC         0x37        // Perform AFC adjustment of the frequency synthesizer  
  76. #define CCxxx0_SWOR         0x38        // Start automatic RX polling sequence (Wake-on-Radio)  
  77. #define CCxxx0_SPWD         0x39        // Enter power down mode when CSn goes high.  
  78. #define CCxxx0_SFRX         0x3A        // Flush the RX FIFO buffer.  
  79. #define CCxxx0_SFTX         0x3B        // Flush the TX FIFO buffer.  
  80. #define CCxxx0_SWORRST      0x3C        // Reset real time clock.  
  81. #define CCxxx0_SNOP         0x3D        // No operation. May be used to pad strobe commands to two  
  82. // INT8Us for simpler software.  
  83.   
  84. #define CCxxx0_PARTNUM      0x30  
  85. #define CCxxx0_VERSION      0x31  
  86. #define CCxxx0_FREQEST      0x32  
  87. #define CCxxx0_LQI          0x33  
  88. #define CCxxx0_RSSI         0x34  
  89. #define CCxxx0_MARCSTATE    0x35  
  90. #define CCxxx0_WORTIME1     0x36  
  91. #define CCxxx0_WORTIME0     0x37  
  92. #define CCxxx0_PKTSTATUS    0x38  
  93. #define CCxxx0_VCO_VC_DAC   0x39  
  94. #define CCxxx0_TXBYTES      0x3A  
  95. #define CCxxx0_RXBYTES      0x3B  
  96.   
  97. #define CCxxx0_PATABLE      0x3E  
  98.   
  99. #define CCxxx0_TXFIFO       0x3F  
  100. #define CCxxx0_RXFIFO       0x3F  
  101.   
  102.   
  103. // RF_SETTINGS is a data structure which contains all relevant CCxxx0 registers  
  104. typedef struct {  
  105.     INT8U iocfg0;     // GDO0 Output Pin Configuration  
  106.     INT8U fifothr;    // RX FIFO and TX FIFO Thresholds  
  107.     INT8U pktctrl0;   // Packet Automation Control  
  108.     INT8U fsctrl1;    // Frequency Synthesizer Control  
  109.     INT8U freq2;      // Frequency Control Word, High Byte  
  110.     INT8U freq1;      // Frequency Control Word, Middle Byte  
  111.     INT8U freq0;      // Frequency Control Word, Low Byte  
  112.     INT8U mdmcfg4;    // Modem Configuration  
  113.     INT8U mdmcfg3;    // Modem Configuration  
  114.     INT8U mdmcfg2;    // Modem Configuration  
  115.     INT8U deviatn;    // Modem Deviation Setting  
  116.     INT8U mcsm0;      // Main Radio Control State Machine Configuration  
  117.     INT8U foccfg;     // Frequency Offset Compensation Configuration  
  118.     INT8U worctrl;    // Wake On Radio Control  
  119.     INT8U fscal3;     // Frequency Synthesizer Calibration  
  120.     INT8U fscal2;     // Frequency Synthesizer Calibration  
  121.     INT8U fscal1;     // Frequency Synthesizer Calibration  
  122.     INT8U fscal0;     // Frequency Synthesizer Calibration  
  123.     INT8U test2;      // Various Test Settings  
  124.     INT8U test1;      // Various Test Settings  
  125.     INT8U test0;      // Various Test Settings  
  126. } RF_SETTINGS;  
  127.   
  128. #endif  
  129. cc1101.c
    1. #include <linux/module.h>  
    2. #include <linux/moduleparam.h>  
    3. #include <linux/init.h>  
    4. #include <linux/sched.h>  
    5.   
    6. #include <linux/kernel.h> /* printk() */  
    7. #include <linux/slab.h>       /* kmalloc() */  
    8. #include <linux/fs.h>     /* everything... */  
    9. #include <linux/errno.h>  /* error codes */  
    10. #include <linux/types.h>  /* size_t */  
    11. #include <linux/proc_fs.h>  
    12. #include <linux/fcntl.h>  /* O_ACCMODE */  
    13. #include <linux/seq_file.h>  
    14. #include <linux/cdev.h>  
    15. #include <linux/poll.h>  
    16.   
    17. #include <linux/irq.h>  
    18. #include <asm/irq.h>  
    19. #include <linux/interrupt.h>  
    20. #include <asm/uaccess.h>  
    21. #include <mach/regs-gpio.h>  
    22. #include <mach/hardware.h>  
    23. #include <linux/platform_device.h>  
    24.   
    25. #include <asm/system.h>       /* cli(), *_flags */  
    26. #include <asm/uaccess.h>  /* copy_*_user */  
    27.   
    28. #include "cc1101.h"  
    29.   
    30. int nop_tmp;  
    31.   
    32. typedef struct cc1101_spi_pin_t  
    33. {  
    34.     unsigned long spi_SCK;     /* GPF4 = SCK 输出 */  
    35.     unsigned long spi_MOSI;    /* GPF3 = MOSI 输出 */     
    36.     unsigned long spi_GDO2;    /* GPG6 = GD02 输出 */  
    37.     unsigned long spi_MISO;    /* GPG5 = MISO 输入 */  
    38.     unsigned long spi_CSN;     /* GPG11 = CSN 输出 */  
    39.     unsigned long spi_GDO0;    /* GPG7 = GD01 输入类型 */  
    40. }cc1101_spi_pin;  
    41.   
    42. typedef struct cc1101_spi_pintype_t  
    43. {  
    44.     unsigned long spi_SCK;     /* GPF4 = SCK 输出 */  
    45.     unsigned long spi_MOSI;    /* GPF3 = MOSI 输出 */     
    46.     unsigned long spi_GDO2;    /* GPG6 = GD02 输出 */  
    47.     unsigned long spi_MISO;    /* GPG5 = MISO 输入 */  
    48.     unsigned long spi_CSN;     /* GPG11 = CSN 输出 */  
    49.     unsigned long spi_GDO0;    /* GPG7 = GD01 下降沿中断类型 */  
    50. }cc1101_spi_pintype;  
    51.   
    52. static cc1101_spi_pin cc1101_pin = {  
    53.     S3C2410_GPF4,  
    54.     S3C2410_GPF3,  
    55.     S3C2410_GPG6,  
    56.     S3C2410_GPG5,  
    57.     S3C2410_GPG11,  
    58.     S3C2410_GPG7,     
    59. };  
    60.   
    61. static cc1101_spi_pintype cc1101_pintype = {  
    62.     S3C2410_GPF4_OUTP,  
    63.     S3C2410_GPF3_OUTP,  
    64.     S3C2410_GPG6_OUTP,  
    65.     S3C2410_GPG5_INP,  
    66.     S3C2410_GPG11_OUTP,  
    67.     S3C2410_GPG7_EINT15,      
    68. };  
    69.   
    70. #define MISO s3c2410_gpio_getpin(cc1101_pin.spi_MISO)  
    71. #define GDO0 s3c2410_gpio_getpin(cc1101_pin.spi_GDO0)  
    72.   
    73. #define MOSI_H s3c2410_gpio_setpin(cc1101_pin.spi_MOSI, 1)  
    74. #define MOSI_L s3c2410_gpio_setpin(cc1101_pin.spi_MOSI, 0)  
    75.   
    76. #define CSN_H s3c2410_gpio_setpin(cc1101_pin.spi_CSN, 1)  
    77. #define CSN_L s3c2410_gpio_setpin(cc1101_pin.spi_CSN, 0)  
    78.   
    79. #define SCK_H s3c2410_gpio_setpin(cc1101_pin.spi_SCK, 1)  
    80. #define SCK_L s3c2410_gpio_setpin(cc1101_pin.spi_SCK, 0)  
    81.   
    82. #define GDO2_H s3c2410_gpio_setpin(cc1101_pin.spi_GDO2, 1)  
    83. #define GDO2_L s3c2410_gpio_setpin(cc1101_pin.spi_GDO2, 0)  
    84.   
    85. void soc_init(void)  
    86. {     
    87.     s3c2410_gpio_cfgpin(cc1101_pin.spi_SCK, cc1101_pintype.spi_SCK);  
    88.     s3c2410_gpio_cfgpin(cc1101_pin.spi_MOSI, cc1101_pintype.spi_MOSI);  
    89.     s3c2410_gpio_cfgpin(cc1101_pin.spi_GDO2, cc1101_pintype.spi_GDO2);  
    90.     s3c2410_gpio_cfgpin(cc1101_pin.spi_MISO, cc1101_pintype.spi_MISO);  
    91.     s3c2410_gpio_cfgpin(cc1101_pin.spi_CSN, cc1101_pintype.spi_CSN);  
    92.     s3c2410_gpio_cfgpin(cc1101_pin.spi_GDO0, cc1101_pintype.spi_GDO0);  
    93.   
    94.     printk("cc1101 set pin ok!");     
    95. }  
    96.   
    97. static void cc1101_delay(unsigned int s)  
    98. {  
    99.     unsigned int i;  
    100.     for(i = 0; i < s; i++);  
    101.     for(i = 0; i < s; i++);  
    102. }  
    103.   
    104. void halWait(INT16U timeout)   
    105. {  
    106.     int i;  
    107.     do   
    108.     {     
    109.         for(i = 0; i < 150; i++)  
    110.             nop_tmp++;  
    111.     }   
    112.     while (--timeout);  
    113. }  
    114.   
    115.   
    116. void SpiInit(void)  
    117. {  
    118.     CSN_L;  
    119.     SCK_L;  
    120.     CSN_H;  
    121. }  
    122.   
    123. /*****************************************************************************************/  
    124. //鍑芥暟鍚嶏細CpuInit()  
    125. //杈撳叆锛氭棤  
    126. //杈撳嚭锛氭棤  
    127. //鍔熻兘鎻忚堪锛歋PI鍒濆鍖栫▼搴?  
    128. /*****************************************************************************************/  
    129. void CpuInit(void)  
    130. {  
    131.     soc_init();  
    132.     SpiInit();  
    133.     cc1101_delay(1500000);  
    134. }  
    135.   
    136.   
    137. //*****************************************************************************************  
    138. //鍑芥暟鍚嶏細SpisendByte(INT8U dat)  
    139. //杈撳叆锛氬彂閫佺殑鏁版嵁  
    140. //杈撳嚭锛氭棤  
    141. //鍔熻兘鎻忚堪锛歋PI鍙戦€佷竴涓瓧鑺?  
    142. //*****************************************************************************************  
    143. INT8U SpiTxRxByte(INT8U dat)  
    144. {  
    145.     INT8U i,temp;  
    146.     temp = 0;  
    147.       
    148.     SCK_L;  
    149.     for(i=0; i<8; i++)  
    150.     {  
    151.         if(dat & 0x80)  
    152.         {  
    153.             MOSI_H;  
    154.         }  
    155.         else MOSI_L;  
    156.         dat <<= 1;  
    157.           
    158.         SCK_H;   
    159.         nop_tmp++;  
    160.         nop_tmp++;  
    161.         nop_tmp++;  
    162.         nop_tmp++;  
    163.         nop_tmp++;  
    164.         nop_tmp++;  
    165.           
    166.         temp <<= 1;  
    167.         if(MISO)temp++;   
    168.         SCK_L;  
    169.         nop_tmp++;  
    170.         nop_tmp++;  
    171.         nop_tmp++;  
    172.         nop_tmp++;  
    173.         nop_tmp++;  
    174.         nop_tmp++;    
    175.     }  
    176.     return temp;  
    177. }  
    178.   
    179. //*****************************************************************************************  
    180. //鍑芥暟鍚嶏細void RESET_CC1100(void)  
    181. //杈撳叆锛氭棤  
    182. //杈撳嚭锛氭棤  
    183. //鍔熻兘鎻忚堪锛氬浣岰C1100  
    184. //*****************************************************************************************  
    185. void RESET_CC1100(void)   
    186. {  
    187.     CSN_L;   
    188.     while (MISO);  
    189.   
    190.     SpiTxRxByte(CCxxx0_SRES);       //鍐欏叆澶嶄綅鍛戒护  
    191.   
    192.     while (MISO);  
    193.       
    194.     CSN_H;   
    195. }  
    196.   
    197. //*****************************************************************************************  
    198. //鍑芥暟鍚嶏細void POWER_UP_RESET_CC1100(void)   
    199. //杈撳叆锛氭棤  
    200. //杈撳嚭锛氭棤  
    201. //鍔熻兘鎻忚堪锛氫笂鐢靛浣岰C1100  
    202. //*****************************************************************************************  
    203. void POWER_UP_RESET_CC1100(void)   
    204. {     
    205.     CSN_H;   
    206.     halWait(10);   
    207.     CSN_L;   
    208.     halWait(10);   
    209.     CSN_H;   
    210.     halWait(410);   
    211.     RESET_CC1100();         //澶嶄綅CC1100  
    212. }  
    213.   
    214. //*****************************************************************************************  
    215. //鍑芥暟鍚嶏細void halSpiWriteReg(INT8U addr, INT8U value)  
    216. //杈撳叆锛氬湴鍧€鍜岄厤缃瓧  
    217. //杈撳嚭锛氭棤  
    218. //鍔熻兘鎻忚堪锛歋PI鍐欏瘎瀛樺櫒  
    219. //*****************************************************************************************  
    220. void halSpiWriteReg(INT8U addr, INT8U value)   
    221. {  
    222.     CSN_L;  
    223.     while (MISO);     
    224.     SpiTxRxByte(addr);      //鍐欏湴鍧€  
    225.     SpiTxRxByte(value);     //鍐欏叆閰嶇疆  
    226.     CSN_H;  
    227. }  
    228.   
    229. //*****************************************************************************************  
    230. //鍑芥暟鍚嶏細void halSpiWriteBurstReg(INT8U addr, INT8U *buffer, INT8U count)  
    231. //杈撳叆锛氬湴鍧€锛屽啓鍏ョ紦鍐插尯锛屽啓鍏ヤ釜鏁?  
    232. //杈撳嚭锛氭棤  
    233. //鍔熻兘鎻忚堪锛歋PI杩炵画鍐欓厤缃瘎瀛樺櫒  
    234. //*****************************************************************************************  
    235. void halSpiWriteBurstReg(INT8U addr, INT8U *buffer, INT8U count)   
    236. {  
    237.     INT8U i, temp;  
    238.     temp = addr | WRITE_BURST;  
    239.     CSN_L;  
    240.     while (MISO);  
    241.     SpiTxRxByte(temp);  
    242.     for (i = 0; i < count; i++)  
    243.     {  
    244.         SpiTxRxByte(buffer[i]);  
    245.     }  
    246.     CSN_H;  
    247. }  
    248.   
    249. //*****************************************************************************************  
    250. //鍑芥暟鍚嶏細void halSpiStrobe(INT8U strobe)  
    251. //杈撳叆锛氬懡浠?  
    252. //杈撳嚭锛氭棤  
    253. //鍔熻兘鎻忚堪锛歋PI鍐欏懡浠?  
    254. //*****************************************************************************************  
    255. void halSpiStrobe(INT8U strobe)   
    256. {  
    257.     CSN_L;  
    258.     while (MISO);  
    259.     SpiTxRxByte(strobe);        //鍐欏叆鍛戒护  
    260.     CSN_H;  
    261. }  
    262.   
    263. //*****************************************************************************************  
    264. //鍑芥暟鍚嶏細INT8U halSpiReadReg(INT8U addr)  
    265. //杈撳叆锛氬湴鍧€  
    266. //杈撳嚭锛氳瀵勫瓨鍣ㄧ殑閰嶇疆瀛?  
    267. //鍔熻兘鎻忚堪锛歋PI璇诲瘎瀛樺櫒  
    268. //*****************************************************************************************  
    269. INT8U halSpiReadReg(INT8U addr)   
    270. {  
    271.     INT8U temp, value;  
    272.     temp = addr|READ_SINGLE;//璇诲瘎瀛樺櫒鍛戒护  
    273.     CSN_L;  
    274.     while (MISO);  
    275.     SpiTxRxByte(temp);  
    276.     value = SpiTxRxByte(0);  
    277.     CSN_H;  
    278.     return value;  
    279. }  
    280.   
    281.   
    282. //*****************************************************************************************  
    283. //鍑芥暟鍚嶏細void halSpiReadBurstReg(INT8U addr, INT8U *buffer, INT8U count)  
    284. //杈撳叆锛氬湴鍧€锛岃鍑烘暟鎹悗鏆傚瓨鐨勭紦鍐插尯锛岃鍑洪厤缃釜鏁?  
    285. //杈撳嚭锛氭棤  
    286. //鍔熻兘鎻忚堪锛歋PI杩炵画鍐欓厤缃瘎瀛樺櫒  
    287. //*****************************************************************************************  
    288. void halSpiReadBurstReg(INT8U addr, INT8U *buffer, INT8U count)   
    289. {  
    290.     INT8U i,temp;  
    291.     temp = addr | READ_BURST;       //鍐欏叆瑕佽鐨勯厤缃瘎瀛樺櫒鍦板潃鍜岃鍛戒护  
    292.     CSN_L;  
    293.     while (MISO);  
    294.     SpiTxRxByte(temp);     
    295.     for (i = 0; i < count; i++)   
    296.     {  
    297.         buffer[i] = SpiTxRxByte(0);  
    298.     }  
    299.     CSN_H;  
    300. }  
    301.   
    302.   
    303. //*****************************************************************************************  
    304. //鍑芥暟鍚嶏細INT8U halSpiReadReg(INT8U addr)  
    305. //杈撳叆锛氬湴鍧€  
    306. //杈撳嚭锛氳鐘舵€佸瘎瀛樺櫒褰撳墠鍊?  
    307. //鍔熻兘鎻忚堪锛歋PI璇荤姸鎬佸瘎瀛樺櫒  
    308. //*****************************************************************************************  
    309. INT8U halSpiReadStatus(INT8U addr)   
    310. {  
    311.     INT8U value,temp;  
    312.     temp = addr | READ_BURST;       //鍐欏叆瑕佽鐨勭姸鎬佸瘎瀛樺櫒鐨勫湴鍧€鍚屾椂鍐欏叆璇诲懡浠?  
    313.     CSN_L;  
    314.     while (MISO);  
    315.     SpiTxRxByte(temp);  
    316.     value = SpiTxRxByte(0);  
    317.     CSN_H;  
    318.     return value;  
    319. }  
    320. //*****************************************************************************************  
    321. //鍑芥暟鍚嶏細void halRfWriteRfSettings(RF_SETTINGS *pRfSettings)  
    322. //杈撳叆锛氭棤  
    323. //杈撳嚭锛氭棤  
    324. //鍔熻兘鎻忚堪锛氶厤缃瓹C1100鐨勫瘎瀛樺櫒  
    325. //*****************************************************************************************  
    326. void halRfWriteRfSettings(void)   
    327. {  
    328. //*******************************此rfSettings配置来自Smart RF***********************************//  
    329. //*******************************Low data rate----2.4kbaud**************************************//  
    330. //*******************************Carrier frequency-----433.99MHz********************************//  
    331.     RF_SETTINGS rfSettings = {  
    332.         0x06,  // IOCFG0        GDO0 Output Pin Configuration  
    333.         0x47,  // FIFOTHR       RX FIFO and TX FIFO Thresholds  
    334.         0x05,  // PKTCTRL0      Packet Automation Control  
    335.         0x06,  // FSCTRL1       Frequency Synthesizer Control  
    336.         0x10,  // FREQ2         Frequency Control Word, High Byte  
    337.         0xB1,  // FREQ1         Frequency Control Word, Middle Byte  
    338.         0x3B,  // FREQ0         Frequency Control Word, Low Byte  
    339.         0xF6,  // MDMCFG4       Modem Configuration  
    340.         0x83,  // MDMCFG3       Modem Configuration  
    341.         0x13,  // MDMCFG2       Modem Configuration  
    342.         0x15,  // DEVIATN       Modem Deviation Setting  
    343.         0x18,  // MCSM0         Main Radio Control State Machine Configuration  
    344.         0x16,  // FOCCFG        Frequency Offset Compensation Configuration  
    345.         0xFB,  // WORCTRL       Wake On Radio Control  
    346.         0xE9,  // FSCAL3        Frequency Synthesizer Calibration  
    347.         0x2A,  // FSCAL2        Frequency Synthesizer Calibration  
    348.         0x00,  // FSCAL1        Frequency Synthesizer Calibration  
    349.         0x1F,  // FSCAL0        Frequency Synthesizer Calibration  
    350.         0x81,  // TEST2         Various Test Settings  
    351.         0x35,  // TEST1         Various Test Settings  
    352.         0x09,  // TEST0         Various Test Settings  
    353.     };  
    354.       
    355.     halSpiWriteReg(CCxxx0_IOCFG0,   rfSettings.iocfg0);   
    356.     halSpiWriteReg(CCxxx0_FIFOTHR,   rfSettings.fifothr);  
    357.     halSpiWriteReg(CCxxx0_PKTCTRL0,   rfSettings.pktctrl0);  
    358.     halSpiWriteReg(CCxxx0_FSCTRL1,   rfSettings.fsctrl1);  
    359.     halSpiWriteReg(CCxxx0_FREQ2,   rfSettings.freq2);  
    360.     halSpiWriteReg(CCxxx0_FREQ1,   rfSettings.freq1);  
    361.     halSpiWriteReg(CCxxx0_FREQ0,   rfSettings.freq0);  
    362.     halSpiWriteReg(CCxxx0_MDMCFG4,   rfSettings.mdmcfg4);  
    363.     halSpiWriteReg(CCxxx0_MDMCFG3,   rfSettings.mdmcfg3);  
    364.     halSpiWriteReg(CCxxx0_MDMCFG2,   rfSettings.mdmcfg2);  
    365.     halSpiWriteReg(CCxxx0_DEVIATN,   rfSettings.deviatn);  
    366.     halSpiWriteReg(CCxxx0_MCSM0,   rfSettings.mcsm0);  
    367.     halSpiWriteReg(CCxxx0_FOCCFG,   rfSettings.foccfg);  
    368.     halSpiWriteReg(CCxxx0_WORCTRL,   rfSettings.worctrl);  
    369.     halSpiWriteReg(CCxxx0_FSCAL3,   rfSettings.fscal3);  
    370.     halSpiWriteReg(CCxxx0_FSCAL2,   rfSettings.fscal2);  
    371.     halSpiWriteReg(CCxxx0_FSCAL1,   rfSettings.fscal1);  
    372.     halSpiWriteReg(CCxxx0_FSCAL0,   rfSettings.fscal0);  
    373.     halSpiWriteReg(CCxxx0_TEST2,   rfSettings.test2);  
    374.     halSpiWriteReg(CCxxx0_TEST1,   rfSettings.test1);  
    375.     halSpiWriteReg(CCxxx0_TEST0,   rfSettings.test0);    
    376. }  
    377. //*****************************************************************************************  
    378. //鍑芥暟鍚嶏細void halRfSendPacket(INT8U *txBuffer, INT8U size)  
    379. //杈撳叆锛氬彂閫佺殑缂撳啿鍖猴紝鍙戦€佹暟鎹釜鏁?  
    380. //杈撳嚭锛氭棤  
    381. //鍔熻兘鎻忚堪锛欳C1100鍙戦€佷竴缁勬暟鎹?  
    382. //*****************************************************************************************  
    383.   
    384. void halRfSendPacket(INT8U *txBuffer, INT8U size)   
    385. {  
    386.     halSpiStrobe(CCxxx0_SIDLE);  
    387.     halSpiStrobe(CCxxx0_STX);       //杩涘叆鍙戦€佹ā寮忓彂閫佹暟鎹?  
    388.     halSpiWriteReg(CCxxx0_TXFIFO, size);  
    389.     halSpiWriteBurstReg(CCxxx0_TXFIFO, txBuffer, size); //鍐欏叆瑕佸彂閫佺殑鏁版嵁  
    390.       
    391.     // Wait for GDO0 to be set -> sync transmitted  
    392.     while (!GDO0);  
    393.     // Wait for GDO0 to be cleared -> end of packet  
    394.     while (GDO0);  
    395.     halSpiStrobe(CCxxx0_SFTX);  
    396.     halSpiStrobe(CCxxx0_SIDLE);  
    397.     halSpiStrobe(CCxxx0_SRX);  
    398. }  
    399.   
    400. //************************************************************************************************//  
    401. //*********************************      鏃犱腑鏂帴鏀跺嚱鏁?     ************************************//  
    402. //***********************************************************************************************//  
    403. INT8U halRfReceivePacket(INT8U *rxBuffer, INT8U *length)   
    404. {  
    405.     INT8U status[2];  
    406.     INT8U packetLength;  
    407.     INT8U i=(*length)*4;  // 鍏蜂綋澶氬皯瑕佹牴鎹甦atarate鍜宭ength鏉ュ喅瀹?  
    408.   
    409.     halSpiStrobe(CCxxx0_SIDLE);  
    410.     halSpiStrobe(CCxxx0_SRX);       //杩涘叆鎺ユ敹鐘舵€?  
    411.     cc1101_delay(20);  
    412.     while (GDO0)  
    413.     {  
    414.         cc1101_delay(20);  
    415.         --i;  
    416.         if(i<1)  
    417.             return 0;         
    418.     }      
    419.     if ((halSpiReadStatus(CCxxx0_RXBYTES) & BYTES_IN_RXFIFO)) //濡傛灉鎺ョ殑瀛楄妭鏁颁笉涓?  
    420.     {  
    421.         packetLength = halSpiReadReg(CCxxx0_RXFIFO);//璇诲嚭绗竴涓瓧鑺傦紝姝ゅ瓧鑺備负璇ュ抚鏁版嵁闀垮害  
    422.         if (packetLength <= *length)         //濡傛灉鎵€瑕佺殑鏈夋晥鏁版嵁闀垮害灏忎簬绛変簬鎺ユ敹鍒扮殑鏁版嵁鍖呯殑闀垮害  
    423.         {  
    424.             halSpiReadBurstReg(CCxxx0_RXFIFO, rxBuffer, packetLength); //璇诲嚭鎵€鏈夋帴鏀跺埌鐨勬暟鎹?  
    425.             *length = packetLength;             //鎶婃帴鏀舵暟鎹暱搴︾殑淇敼涓哄綋鍓嶆暟鎹殑闀垮害  
    426.               
    427.             // Read the 2 appended status bytes (status[0] = RSSI, status[1] = LQI)  
    428.             halSpiReadBurstReg(CCxxx0_RXFIFO, status, 2);   //璇诲嚭CRC鏍¢獙浣?  
    429.             halSpiStrobe(CCxxx0_SFRX);      //娓呮礂鎺ユ敹缂撳啿鍖?  
    430.             return (status[1] & CRC_OK);            //濡傛灉鏍¢獙鎴愬姛杩斿洖鎺ユ敹鎴愬姛  
    431.         }  
    432.         else   
    433.         {  
    434.             *length = packetLength;  
    435.             halSpiStrobe(CCxxx0_SFRX);      //娓呮礂鎺ユ敹缂撳啿鍖?  
    436.             return 0;  
    437.         }  
    438.     }   
    439.     else  
    440.         return 0;  
    441. }  
    442.   
    443. static int Init_CC1100(void)  
    444. {  
    445.     INT8U PaTabel[8] = {0x60 ,0x60 ,0x60 ,0x60 ,0x60 ,0x60 ,0x60 ,0x60};    
    446.       
    447.     CpuInit();  
    448.     POWER_UP_RESET_CC1100();  
    449.     halRfWriteRfSettings();  
    450.     halSpiWriteBurstReg(CCxxx0_PATABLE, PaTabel, 8);  
    451.   
    452.     return 0;  
    453. }  
    454.   
    455. /****************************************************************************************/  
    456. #define CC1101_BUFLEN 16  
    457. static dev_t cc1101_dev_no = 0;  
    458. static volatile int rcv_flag;  
    459.   
    460. /* cc1101设备 */  
    461. typedef struct tag_cc1101_dev_t   
    462. {   
    463.     struct cdev cdev;  
    464.     unsigned char cc1101_buf[CC1101_BUFLEN];  
    465.     wait_queue_head_t read_wait;  
    466. }cc1101_dev_t;   
    467.   
    468. static cc1101_dev_t cc1101_dev;  
    469.   
    470. struct rcv_irq_desc {  
    471.     int irq;  
    472.     int pin;  
    473.     int pin_setting;  
    474.     char *name;   
    475. };  
    476.   
    477. static irqreturn_t cc1101_rcv_interrupt(int irq, void *dev_id)  
    478. {  
    479.     INT8U count = CC1101_BUFLEN;  
    480.     int ret;  
    481.     printk("cc1101 handle interrupt!\n");  
    482.   
    483.     ret = halRfReceivePacket(cc1101_dev.cc1101_buf, &count);  
    484.     if (0 != ret)  
    485.     {  
    486.         /* 
    487.         printk("cc1101 receiving .... start\n"); 
    488.         printk("cc1101 receiving .... end\n"); 
    489.         printk("cc1101 receiving %d bytes(s):%s\n", count, cc1101_dev.cc1101_buf); 
    490.         */  
    491.   
    492.         rcv_flag = 1;  
    493.         wake_up_interruptible(&cc1101_dev.read_wait);  
    494.     }  
    495.   
    496.     return IRQ_RETVAL(IRQ_HANDLED);  
    497. }  
    498.   
    499. static struct rcv_irq_desc cc1101_rcv_irq = {  
    500.     IRQ_EINT15,   
    501.     S3C2410_GPG7,   
    502.     S3C2410_GPG7_EINT15,   
    503.     "spi_GDO0"};  
    504.   
    505.   
    506. /*文件打开函数*/  
    507. int cc1101_open(struct inode *inode, struct file *filp)  
    508. {  
    509.     int ret;  
    510.       
    511.     ret = request_irq(cc1101_rcv_irq.irq, cc1101_rcv_interrupt, IRQ_TYPE_EDGE_FALLING,   
    512.                       cc1101_rcv_irq.name, (void *)&cc1101_rcv_irq);  
    513.     if (ret)  
    514.     {  
    515.         printk("request_irq error!\n");  
    516.         return -EBUSY;  
    517.     }  
    518.                   
    519.     return 0;  
    520. }  
    521.   
    522. /*写函数*/  
    523. static ssize_t cc1101_write(struct file *filp, const char __user *buf, size_t size, loff_t *ppos)  
    524. {  
    525.     unsigned int count = size;  
    526.     int ret = 0;  
    527.       
    528.     /*分析和获取有效的写长度*/  
    529.     if (CC1101_BUFLEN != size)    
    530.     {  
    531.         printk("cc1101 write wrong len:%d\n", size);  
    532.         return -ENOMEM;  
    533.     }  
    534.   
    535.     /*用户空间->内核空间*/  
    536.     if (copy_from_user(cc1101_dev.cc1101_buf, buf, count))  
    537.         ret =  - EFAULT;  
    538.     else  
    539.     {  
    540.         ret = count;  
    541.         //printk("kernel-space: cc1101 written %d bytes(s):%s\n", count, cc1101_dev.cc1101_buf);  
    542.     }  
    543.   
    544.     /* CC1101硬件发送 */  
    545.     //printk("kernel-space: cc1101 sending .... start\n");  
    546.     halRfSendPacket(cc1101_dev.cc1101_buf, count);  
    547.     //printk("kernel-space: cc1101 sending .... end\n");  
    548.   
    549.     return ret;  
    550. }  
    551.   
    552. /* 读函数 */  
    553. static ssize_t cc1101_waitqueue_read(struct file *filp, char __user *buf, size_t size, loff_t *ppos)  
    554. {  
    555.     unsigned int count = size;  
    556.     int ret = 0;  
    557.     DECLARE_WAITQUEUE(wait, current);  
    558.       
    559.     if (CC1101_BUFLEN != count)  
    560.     {  
    561.         printk("kernel-space: cc1101 read wrong len:%d\n", count);  
    562.         return -ENOMEM;  
    563.     }  
    564.   
    565.     add_wait_queue(&cc1101_dev.read_wait, &wait);  
    566.       
    567.     if (0 == rcv_flag)  
    568.     {  
    569.         if (filp->f_flags & O_NONBLOCK)  
    570.         {  
    571.             ret = -EAGAIN;  
    572.             goto out;  
    573.         }  
    574.   
    575.         __set_current_state(TASK_INTERRUPTIBLE);  
    576.         schedule();  
    577.         if (signal_pending(current))  
    578.         {  
    579.             ret =  - ERESTARTSYS;  
    580.             goto out;  
    581.         }  
    582.     }  
    583.   
    584.     /* 内核空间->用户空间 */  
    585.     copy_to_user(buf, cc1101_dev.cc1101_buf, count);  
    586.       
    587.     ret = count;  
    588.   
    589.     out:  
    590.         remove_wait_queue(&cc1101_dev.read_wait, &wait);  
    591.       
    592.     set_current_state(TASK_RUNNING);  
    593.     rcv_flag = 0;  
    594.     return ret;  
    595. }  
    596.   
    597. /* poll函数 */  
    598. static unsigned int cc1101_poll(struct file *filp, poll_table *wait)  
    599. {  
    600.     unsigned int mask = 0;  
    601.       
    602.     poll_wait(filp, &cc1101_dev.read_wait, wait);     
    603.   
    604.     if (1 == rcv_flag)  
    605.     {  
    606.         mask |= POLLIN | POLLRDNORM;  
    607.         printk("kernel-space: cc1101_poll rcv_flag = 1!\n");  
    608.     }  
    609.       
    610.     return mask;  
    611. }  
    612.   
    613. static int cc1101_close(struct inode *inode, struct file *file)  
    614. {  
    615.     free_irq(cc1101_rcv_irq.irq, (void *)&cc1101_rcv_irq);  
    616.   
    617.     printk("kernel-space: cc1101_close!\n");  
    618.     return 0;  
    619. }  
    620.   
    621. struct file_operations cc1101_fops =   
    622. {   
    623.     .owner = THIS_MODULE,  
    624.     .open = cc1101_open,  
    625.     .release = cc1101_close,  
    626.     .write = cc1101_write,  
    627.     .read = cc1101_waitqueue_read,  
    628.     .poll = cc1101_poll,  
    629. };  
    630.   
    631. /*初始化并注册cdev*/  
    632. static int cc1101_setup_cdev(void)  
    633. {  
    634.     int err;  
    635.   
    636.     cdev_init(&cc1101_dev.cdev, &cc1101_fops);    
    637.   
    638.     cc1101_dev.cdev.owner = THIS_MODULE;  
    639.     cc1101_dev.cdev.ops = &cc1101_fops;  
    640.   
    641.     err = cdev_add(&cc1101_dev.cdev, cc1101_dev_no, 1);  
    642.     if (err)  
    643.         printk("cc1101 cc1101_setup_cdev error!");  
    644.   
    645.     return err;  
    646. }  
    647.   
    648. static int __init cc1101_init(void)   
    649. {   
    650.     int ret = 0;  
    651.   
    652.     ret = Init_CC1100();  
    653.     if (0 != ret)  
    654.         goto init_fail;  
    655.   
    656.     ret = alloc_chrdev_region(&cc1101_dev_no, 0, 1, "cc1101");  
    657.     if (0 < ret)  
    658.         goto init_fail;  
    659.   
    660.     init_waitqueue_head(&cc1101_dev.read_wait);  
    661.       
    662.     ret = cc1101_setup_cdev();  
    663.     if (0 != ret)  
    664.     {  
    665.         unregister_chrdev_region(cc1101_dev_no, 1);   
    666.         goto init_fail;  
    667.     }  
    668.   
    669.     printk("cc1101 init success!\n");  
    670.     return 0;  
    671.   
    672.     init_fail:  
    673.         printk("cc1101 init failed!\n");  
    674.           
    675.     return ret;  
    676. }   
    677.   
    678. static void  __exit cc1101_exit(void)   
    679. {   
    680.     unregister_chrdev_region(cc1101_dev_no, 1);   
    681.     cdev_del(&cc1101_dev.cdev);   
    682.     printk("cc1101 exit success!\n");  
    683. }  
    684.   
    685. module_init(cc1101_init);  
    686. module_exit(cc1101_exit);  
    687.   
    688. MODULE_LICENSE("GPL");  
    689. MODULE_AUTHOR("forsakening-hdu");  
    690. MODULE_DESCRIPTION("cc1101 control for EmbedSky TQ2440 Board"); 


cc1101.c

  1. #include <linux/module.h>  
  2. #include <linux/moduleparam.h>  
  3. #include <linux/init.h>  
  4. #include <linux/sched.h>  
  5.   
  6. #include <linux/kernel.h> /* printk() */  
  7. #include <linux/slab.h>       /* kmalloc() */  
  8. #include <linux/fs.h>     /* everything... */  
  9. #include <linux/errno.h>  /* error codes */  
  10. #include <linux/types.h>  /* size_t */  
  11. #include <linux/proc_fs.h>  
  12. #include <linux/fcntl.h>  /* O_ACCMODE */  
  13. #include <linux/seq_file.h>  
  14. #include <linux/cdev.h>  
  15. #include <linux/poll.h>  
  16.   
  17. #include <linux/irq.h>  
  18. #include <asm/irq.h>  
  19. #include <linux/interrupt.h>  
  20. #include <asm/uaccess.h>  
  21. #include <mach/regs-gpio.h>  
  22. #include <mach/hardware.h>  
  23. #include <linux/platform_device.h>  
  24.   
  25. #include <asm/system.h>       /* cli(), *_flags */  
  26. #include <asm/uaccess.h>  /* copy_*_user */  
  27.   
  28. #include "cc1101.h"  
  29.   
  30. int nop_tmp;  
  31.   
  32. typedef struct cc1101_spi_pin_t  
  33. {  
  34.     unsigned long spi_SCK;     /* GPF4 = SCK 输出 */  
  35.     unsigned long spi_MOSI;    /* GPF3 = MOSI 输出 */     
  36.     unsigned long spi_GDO2;    /* GPG6 = GD02 输出 */  
  37.     unsigned long spi_MISO;    /* GPG5 = MISO 输入 */  
  38.     unsigned long spi_CSN;     /* GPG11 = CSN 输出 */  
  39.     unsigned long spi_GDO0;    /* GPG7 = GD01 输入类型 */  
  40. }cc1101_spi_pin;  
  41.   
  42. typedef struct cc1101_spi_pintype_t  
  43. {  
  44.     unsigned long spi_SCK;     /* GPF4 = SCK 输出 */  
  45.     unsigned long spi_MOSI;    /* GPF3 = MOSI 输出 */     
  46.     unsigned long spi_GDO2;    /* GPG6 = GD02 输出 */  
  47.     unsigned long spi_MISO;    /* GPG5 = MISO 输入 */  
  48.     unsigned long spi_CSN;     /* GPG11 = CSN 输出 */  
  49.     unsigned long spi_GDO0;    /* GPG7 = GD01 下降沿中断类型 */  
  50. }cc1101_spi_pintype;  
  51.   
  52. static cc1101_spi_pin cc1101_pin = {  
  53.     S3C2410_GPF4,  
  54.     S3C2410_GPF3,  
  55.     S3C2410_GPG6,  
  56.     S3C2410_GPG5,  
  57.     S3C2410_GPG11,  
  58.     S3C2410_GPG7,     
  59. };  
  60.   
  61. static cc1101_spi_pintype cc1101_pintype = {  
  62.     S3C2410_GPF4_OUTP,  
  63.     S3C2410_GPF3_OUTP,  
  64.     S3C2410_GPG6_OUTP,  
  65.     S3C2410_GPG5_INP,  
  66.     S3C2410_GPG11_OUTP,  
  67.     S3C2410_GPG7_EINT15,      
  68. };  
  69.   
  70. #define MISO s3c2410_gpio_getpin(cc1101_pin.spi_MISO)  
  71. #define GDO0 s3c2410_gpio_getpin(cc1101_pin.spi_GDO0)  
  72.   
  73. #define MOSI_H s3c2410_gpio_setpin(cc1101_pin.spi_MOSI, 1)  
  74. #define MOSI_L s3c2410_gpio_setpin(cc1101_pin.spi_MOSI, 0)  
  75.   
  76. #define CSN_H s3c2410_gpio_setpin(cc1101_pin.spi_CSN, 1)  
  77. #define CSN_L s3c2410_gpio_setpin(cc1101_pin.spi_CSN, 0)  
  78.   
  79. #define SCK_H s3c2410_gpio_setpin(cc1101_pin.spi_SCK, 1)  
  80. #define SCK_L s3c2410_gpio_setpin(cc1101_pin.spi_SCK, 0)  
  81.   
  82. #define GDO2_H s3c2410_gpio_setpin(cc1101_pin.spi_GDO2, 1)  
  83. #define GDO2_L s3c2410_gpio_setpin(cc1101_pin.spi_GDO2, 0)  
  84.   
  85. void soc_init(void)  
  86. {     
  87.     s3c2410_gpio_cfgpin(cc1101_pin.spi_SCK, cc1101_pintype.spi_SCK);  
  88.     s3c2410_gpio_cfgpin(cc1101_pin.spi_MOSI, cc1101_pintype.spi_MOSI);  
  89.     s3c2410_gpio_cfgpin(cc1101_pin.spi_GDO2, cc1101_pintype.spi_GDO2);  
  90.     s3c2410_gpio_cfgpin(cc1101_pin.spi_MISO, cc1101_pintype.spi_MISO);  
  91.     s3c2410_gpio_cfgpin(cc1101_pin.spi_CSN, cc1101_pintype.spi_CSN);  
  92.     s3c2410_gpio_cfgpin(cc1101_pin.spi_GDO0, cc1101_pintype.spi_GDO0);  
  93.   
  94.     printk("cc1101 set pin ok!");     
  95. }  
  96.   
  97. static void cc1101_delay(unsigned int s)  
  98. {  
  99.     unsigned int i;  
  100.     for(i = 0; i < s; i++);  
  101.     for(i = 0; i < s; i++);  
  102. }  
  103.   
  104. void halWait(INT16U timeout)   
  105. {  
  106.     int i;  
  107.     do   
  108.     {     
  109.         for(i = 0; i < 150; i++)  
  110.             nop_tmp++;  
  111.     }   
  112.     while (--timeout);  
  113. }  
  114.   
  115.   
  116. void SpiInit(void)  
  117. {  
  118.     CSN_L;  
  119.     SCK_L;  
  120.     CSN_H;  
  121. }  
  122.   
  123. /*****************************************************************************************/  
  124. //鍑芥暟鍚嶏細CpuInit()  
  125. //杈撳叆锛氭棤  
  126. //杈撳嚭锛氭棤  
  127. //鍔熻兘鎻忚堪锛歋PI鍒濆鍖栫▼搴?  
  128. /*****************************************************************************************/  
  129. void CpuInit(void)  
  130. {  
  131.     soc_init();  
  132.     SpiInit();  
  133.     cc1101_delay(1500000);  
  134. }  
  135.   
  136.   
  137. //*****************************************************************************************  
  138. //鍑芥暟鍚嶏細SpisendByte(INT8U dat)  
  139. //杈撳叆锛氬彂閫佺殑鏁版嵁  
  140. //杈撳嚭锛氭棤  
  141. //鍔熻兘鎻忚堪锛歋PI鍙戦€佷竴涓瓧鑺?  
  142. //*****************************************************************************************  
  143. INT8U SpiTxRxByte(INT8U dat)  
  144. {  
  145.     INT8U i,temp;  
  146.     temp = 0;  
  147.       
  148.     SCK_L;  
  149.     for(i=0; i<8; i++)  
  150.     {  
  151.         if(dat & 0x80)  
  152.         {  
  153.             MOSI_H;  
  154.         }  
  155.         else MOSI_L;  
  156.         dat <<= 1;  
  157.           
  158.         SCK_H;   
  159.         nop_tmp++;  
  160.         nop_tmp++;  
  161.         nop_tmp++;  
  162.         nop_tmp++;  
  163.         nop_tmp++;  
  164.         nop_tmp++;  
  165.           
  166.         temp <<= 1;  
  167.         if(MISO)temp++;   
  168.         SCK_L;  
  169.         nop_tmp++;  
  170.         nop_tmp++;  
  171.         nop_tmp++;  
  172.         nop_tmp++;  
  173.         nop_tmp++;  
  174.         nop_tmp++;    
  175.     }  
  176.     return temp;  
  177. }  
  178.   
  179. //*****************************************************************************************  
  180. //鍑芥暟鍚嶏細void RESET_CC1100(void)  
  181. //杈撳叆锛氭棤  
  182. //杈撳嚭锛氭棤  
  183. //鍔熻兘鎻忚堪锛氬浣岰C1100  
  184. //*****************************************************************************************  
  185. void RESET_CC1100(void)   
  186. {  
  187.     CSN_L;   
  188.     while (MISO);  
  189.   
  190.     SpiTxRxByte(CCxxx0_SRES);       //鍐欏叆澶嶄綅鍛戒护  
  191.   
  192.     while (MISO);  
  193.       
  194.     CSN_H;   
  195. }  
  196.   
  197. //*****************************************************************************************  
  198. //鍑芥暟鍚嶏細void POWER_UP_RESET_CC1100(void)   
  199. //杈撳叆锛氭棤  
  200. //杈撳嚭锛氭棤  
  201. //鍔熻兘鎻忚堪锛氫笂鐢靛浣岰C1100  
  202. //*****************************************************************************************  
  203. void POWER_UP_RESET_CC1100(void)   
  204. {     
  205.     CSN_H;   
  206.     halWait(10);   
  207.     CSN_L;   
  208.     halWait(10);   
  209.     CSN_H;   
  210.     halWait(410);   
  211.     RESET_CC1100();         //澶嶄綅CC1100  
  212. }  
  213.   
  214. //*****************************************************************************************  
  215. //鍑芥暟鍚嶏細void halSpiWriteReg(INT8U addr, INT8U value)  
  216. //杈撳叆锛氬湴鍧€鍜岄厤缃瓧  
  217. //杈撳嚭锛氭棤  
  218. //鍔熻兘鎻忚堪锛歋PI鍐欏瘎瀛樺櫒  
  219. //*****************************************************************************************  
  220. void halSpiWriteReg(INT8U addr, INT8U value)   
  221. {  
  222.     CSN_L;  
  223.     while (MISO);     
  224.     SpiTxRxByte(addr);      //鍐欏湴鍧€  
  225.     SpiTxRxByte(value);     //鍐欏叆閰嶇疆  
  226.     CSN_H;  
  227. }  
  228.   
  229. //*****************************************************************************************  
  230. //鍑芥暟鍚嶏細void halSpiWriteBurstReg(INT8U addr, INT8U *buffer, INT8U count)  
  231. //杈撳叆锛氬湴鍧€锛屽啓鍏ョ紦鍐插尯锛屽啓鍏ヤ釜鏁?  
  232. //杈撳嚭锛氭棤  
  233. //鍔熻兘鎻忚堪锛歋PI杩炵画鍐欓厤缃瘎瀛樺櫒  
  234. //*****************************************************************************************  
  235. void halSpiWriteBurstReg(INT8U addr, INT8U *buffer, INT8U count)   
  236. {  
  237.     INT8U i, temp;  
  238.     temp = addr | WRITE_BURST;  
  239.     CSN_L;  
  240.     while (MISO);  
  241.     SpiTxRxByte(temp);  
  242.     for (i = 0; i < count; i++)  
  243.     {  
  244.         SpiTxRxByte(buffer[i]);  
  245.     }  
  246.     CSN_H;  
  247. }  
  248.   
  249. //*****************************************************************************************  
  250. //鍑芥暟鍚嶏細void halSpiStrobe(INT8U strobe)  
  251. //杈撳叆锛氬懡浠?  
  252. //杈撳嚭锛氭棤  
  253. //鍔熻兘鎻忚堪锛歋PI鍐欏懡浠?  
  254. //*****************************************************************************************  
  255. void halSpiStrobe(INT8U strobe)   
  256. {  
  257.     CSN_L;  
  258.     while (MISO);  
  259.     SpiTxRxByte(strobe);        //鍐欏叆鍛戒护  
  260.     CSN_H;  
  261. }  
  262.   
  263. //*****************************************************************************************  
  264. //鍑芥暟鍚嶏細INT8U halSpiReadReg(INT8U addr)  
  265. //杈撳叆锛氬湴鍧€  
  266. //杈撳嚭锛氳瀵勫瓨鍣ㄧ殑閰嶇疆瀛?  
  267. //鍔熻兘鎻忚堪锛歋PI璇诲瘎瀛樺櫒  
  268. //*****************************************************************************************  
  269. INT8U halSpiReadReg(INT8U addr)   
  270. {  
  271.     INT8U temp, value;  
  272.     temp = addr|READ_SINGLE;//璇诲瘎瀛樺櫒鍛戒护  
  273.     CSN_L;  
  274.     while (MISO);  
  275.     SpiTxRxByte(temp);  
  276.     value = SpiTxRxByte(0);  
  277.     CSN_H;  
  278.     return value;  
  279. }  
  280.   
  281.   
  282. //*****************************************************************************************  
  283. //鍑芥暟鍚嶏細void halSpiReadBurstReg(INT8U addr, INT8U *buffer, INT8U count)  
  284. //杈撳叆锛氬湴鍧€锛岃鍑烘暟鎹悗鏆傚瓨鐨勭紦鍐插尯锛岃鍑洪厤缃釜鏁?  
  285. //杈撳嚭锛氭棤  
  286. //鍔熻兘鎻忚堪锛歋PI杩炵画鍐欓厤缃瘎瀛樺櫒  
  287. //*****************************************************************************************  
  288. void halSpiReadBurstReg(INT8U addr, INT8U *buffer, INT8U count)   
  289. {  
  290.     INT8U i,temp;  
  291.     temp = addr | READ_BURST;       //鍐欏叆瑕佽鐨勯厤缃瘎瀛樺櫒鍦板潃鍜岃鍛戒护  
  292.     CSN_L;  
  293.     while (MISO);  
  294.     SpiTxRxByte(temp);     
  295.     for (i = 0; i < count; i++)   
  296.     {  
  297.         buffer[i] = SpiTxRxByte(0);  
  298.     }  
  299.     CSN_H;  
  300. }  
  301.   
  302.   
  303. //*****************************************************************************************  
  304. //鍑芥暟鍚嶏細INT8U halSpiReadReg(INT8U addr)  
  305. //杈撳叆锛氬湴鍧€  
  306. //杈撳嚭锛氳鐘舵€佸瘎瀛樺櫒褰撳墠鍊?  
  307. //鍔熻兘鎻忚堪锛歋PI璇荤姸鎬佸瘎瀛樺櫒  
  308. //*****************************************************************************************  
  309. INT8U halSpiReadStatus(INT8U addr)   
  310. {  
  311.     INT8U value,temp;  
  312.     temp = addr | READ_BURST;       //鍐欏叆瑕佽鐨勭姸鎬佸瘎瀛樺櫒鐨勫湴鍧€鍚屾椂鍐欏叆璇诲懡浠?  
  313.     CSN_L;  
  314.     while (MISO);  
  315.     SpiTxRxByte(temp);  
  316.     value = SpiTxRxByte(0);  
  317.     CSN_H;  
  318.     return value;  
  319. }  
  320. //*****************************************************************************************  
  321. //鍑芥暟鍚嶏細void halRfWriteRfSettings(RF_SETTINGS *pRfSettings)  
  322. //杈撳叆锛氭棤  
  323. //杈撳嚭锛氭棤  
  324. //鍔熻兘鎻忚堪锛氶厤缃瓹C1100鐨勫瘎瀛樺櫒  
  325. //*****************************************************************************************  
  326. void halRfWriteRfSettings(void)   
  327. {  
  328. //*******************************此rfSettings配置来自Smart RF***********************************//  
  329. //*******************************Low data rate----2.4kbaud**************************************//  
  330. //*******************************Carrier frequency-----433.99MHz********************************//  
  331.     RF_SETTINGS rfSettings = {  
  332.         0x06,  // IOCFG0        GDO0 Output Pin Configuration  
  333.         0x47,  // FIFOTHR       RX FIFO and TX FIFO Thresholds  
  334.         0x05,  // PKTCTRL0      Packet Automation Control  
  335.         0x06,  // FSCTRL1       Frequency Synthesizer Control  
  336.         0x10,  // FREQ2         Frequency Control Word, High Byte  
  337.         0xB1,  // FREQ1         Frequency Control Word, Middle Byte  
  338.         0x3B,  // FREQ0         Frequency Control Word, Low Byte  
  339.         0xF6,  // MDMCFG4       Modem Configuration  
  340.         0x83,  // MDMCFG3       Modem Configuration  
  341.         0x13,  // MDMCFG2       Modem Configuration  
  342.         0x15,  // DEVIATN       Modem Deviation Setting  
  343.         0x18,  // MCSM0         Main Radio Control State Machine Configuration  
  344.         0x16,  // FOCCFG        Frequency Offset Compensation Configuration  
  345.         0xFB,  // WORCTRL       Wake On Radio Control  
  346.         0xE9,  // FSCAL3        Frequency Synthesizer Calibration  
  347.         0x2A,  // FSCAL2        Frequency Synthesizer Calibration  
  348.         0x00,  // FSCAL1        Frequency Synthesizer Calibration  
  349.         0x1F,  // FSCAL0        Frequency Synthesizer Calibration  
  350.         0x81,  // TEST2         Various Test Settings  
  351.         0x35,  // TEST1         Various Test Settings  
  352.         0x09,  // TEST0         Various Test Settings  
  353.     };  
  354.       
  355.     halSpiWriteReg(CCxxx0_IOCFG0,   rfSettings.iocfg0);   
  356.     halSpiWriteReg(CCxxx0_FIFOTHR,   rfSettings.fifothr);  
  357.     halSpiWriteReg(CCxxx0_PKTCTRL0,   rfSettings.pktctrl0);  
  358.     halSpiWriteReg(CCxxx0_FSCTRL1,   rfSettings.fsctrl1);  
  359.     halSpiWriteReg(CCxxx0_FREQ2,   rfSettings.freq2);  
  360.     halSpiWriteReg(CCxxx0_FREQ1,   rfSettings.freq1);  
  361.     halSpiWriteReg(CCxxx0_FREQ0,   rfSettings.freq0);  
  362.     halSpiWriteReg(CCxxx0_MDMCFG4,   rfSettings.mdmcfg4);  
  363.     halSpiWriteReg(CCxxx0_MDMCFG3,   rfSettings.mdmcfg3);  
  364.     halSpiWriteReg(CCxxx0_MDMCFG2,   rfSettings.mdmcfg2);  
  365.     halSpiWriteReg(CCxxx0_DEVIATN,   rfSettings.deviatn);  
  366.     halSpiWriteReg(CCxxx0_MCSM0,   rfSettings.mcsm0);  
  367.     halSpiWriteReg(CCxxx0_FOCCFG,   rfSettings.foccfg);  
  368.     halSpiWriteReg(CCxxx0_WORCTRL,   rfSettings.worctrl);  
  369.     halSpiWriteReg(CCxxx0_FSCAL3,   rfSettings.fscal3);  
  370.     halSpiWriteReg(CCxxx0_FSCAL2,   rfSettings.fscal2);  
  371.     halSpiWriteReg(CCxxx0_FSCAL1,   rfSettings.fscal1);  
  372.     halSpiWriteReg(CCxxx0_FSCAL0,   rfSettings.fscal0);  
  373.     halSpiWriteReg(CCxxx0_TEST2,   rfSettings.test2);  
  374.     halSpiWriteReg(CCxxx0_TEST1,   rfSettings.test1);  
  375.     halSpiWriteReg(CCxxx0_TEST0,   rfSettings.test0);    
  376. }  
  377. //*****************************************************************************************  
  378. //鍑芥暟鍚嶏細void halRfSendPacket(INT8U *txBuffer, INT8U size)  
  379. //杈撳叆锛氬彂閫佺殑缂撳啿鍖猴紝鍙戦€佹暟鎹釜鏁?  
  380. //杈撳嚭锛氭棤  
  381. //鍔熻兘鎻忚堪锛欳C1100鍙戦€佷竴缁勬暟鎹?  
  382. //*****************************************************************************************  
  383.   
  384. void halRfSendPacket(INT8U *txBuffer, INT8U size)   
  385. {  
  386.     halSpiStrobe(CCxxx0_SIDLE);  
  387.     halSpiStrobe(CCxxx0_STX);       //杩涘叆鍙戦€佹ā寮忓彂閫佹暟鎹?  
  388.     halSpiWriteReg(CCxxx0_TXFIFO, size);  
  389.     halSpiWriteBurstReg(CCxxx0_TXFIFO, txBuffer, size); //鍐欏叆瑕佸彂閫佺殑鏁版嵁  
  390.       
  391.     // Wait for GDO0 to be set -> sync transmitted  
  392.     while (!GDO0);  
  393.     // Wait for GDO0 to be cleared -> end of packet  
  394.     while (GDO0);  
  395.     halSpiStrobe(CCxxx0_SFTX);  
  396.     halSpiStrobe(CCxxx0_SIDLE);  
  397.     halSpiStrobe(CCxxx0_SRX);  
  398. }  
  399.   
  400. //************************************************************************************************//  
  401. //*********************************      鏃犱腑鏂帴鏀跺嚱鏁?     ************************************//  
  402. //***********************************************************************************************//  
  403. INT8U halRfReceivePacket(INT8U *rxBuffer, INT8U *length)   
  404. {  
  405.     INT8U status[2];  
  406.     INT8U packetLength;  
  407.     INT8U i=(*length)*4;  // 鍏蜂綋澶氬皯瑕佹牴鎹甦atarate鍜宭ength鏉ュ喅瀹?  
  408.   
  409.     halSpiStrobe(CCxxx0_SIDLE);  
  410.     halSpiStrobe(CCxxx0_SRX);       //杩涘叆鎺ユ敹鐘舵€?  
  411.     cc1101_delay(20);  
  412.     while (GDO0)  
  413.     {  
  414.         cc1101_delay(20);  
  415.         --i;  
  416.         if(i<1)  
  417.             return 0;         
  418.     }      
  419.     if ((halSpiReadStatus(CCxxx0_RXBYTES) & BYTES_IN_RXFIFO)) //濡傛灉鎺ョ殑瀛楄妭鏁颁笉涓?  
  420.     {  
  421.         packetLength = halSpiReadReg(CCxxx0_RXFIFO);//璇诲嚭绗竴涓瓧鑺傦紝姝ゅ瓧鑺備负璇ュ抚鏁版嵁闀垮害  
  422.         if (packetLength <= *length)         //濡傛灉鎵€瑕佺殑鏈夋晥鏁版嵁闀垮害灏忎簬绛変簬鎺ユ敹鍒扮殑鏁版嵁鍖呯殑闀垮害  
  423.         {  
  424.             halSpiReadBurstReg(CCxxx0_RXFIFO, rxBuffer, packetLength); //璇诲嚭鎵€鏈夋帴鏀跺埌鐨勬暟鎹?  
  425.             *length = packetLength;             //鎶婃帴鏀舵暟鎹暱搴︾殑淇敼涓哄綋鍓嶆暟鎹殑闀垮害  
  426.               
  427.             // Read the 2 appended status bytes (status[0] = RSSI, status[1] = LQI)  
  428.             halSpiReadBurstReg(CCxxx0_RXFIFO, status, 2);   //璇诲嚭CRC鏍¢獙浣?  
  429.             halSpiStrobe(CCxxx0_SFRX);      //娓呮礂鎺ユ敹缂撳啿鍖?  
  430.             return (status[1] & CRC_OK);            //濡傛灉鏍¢獙鎴愬姛杩斿洖鎺ユ敹鎴愬姛  
  431.         }  
  432.         else   
  433.         {  
  434.             *length = packetLength;  
  435.             halSpiStrobe(CCxxx0_SFRX);      //娓呮礂鎺ユ敹缂撳啿鍖?  
  436.             return 0;  
  437.         }  
  438.     }   
  439.     else  
  440.         return 0;  
  441. }  
  442.   
  443. static int Init_CC1100(void)  
  444. {  
  445.     INT8U PaTabel[8] = {0x60 ,0x60 ,0x60 ,0x60 ,0x60 ,0x60 ,0x60 ,0x60};    
  446.       
  447.     CpuInit();  
  448.     POWER_UP_RESET_CC1100();  
  449.     halRfWriteRfSettings();  
  450.     halSpiWriteBurstReg(CCxxx0_PATABLE, PaTabel, 8);  
  451.   
  452.     return 0;  
  453. }  
  454.   
  455. /****************************************************************************************/  
  456. #define CC1101_BUFLEN 16  
  457. static dev_t cc1101_dev_no = 0;  
  458. static volatile int rcv_flag;  
  459.   
  460. /* cc1101设备 */  
  461. typedef struct tag_cc1101_dev_t   
  462. {   
  463.     struct cdev cdev;  
  464.     unsigned char cc1101_buf[CC1101_BUFLEN];  
  465.     wait_queue_head_t read_wait;  
  466. }cc1101_dev_t;   
  467.   
  468. static cc1101_dev_t cc1101_dev;  
  469.   
  470. struct rcv_irq_desc {  
  471.     int irq;  
  472.     int pin;  
  473.     int pin_setting;  
  474.     char *name;   
  475. };  
  476.   
  477. static irqreturn_t cc1101_rcv_interrupt(int irq, void *dev_id)  
  478. {  
  479.     INT8U count = CC1101_BUFLEN;  
  480.     int ret;  
  481.     printk("cc1101 handle interrupt!\n");  
  482.   
  483.     ret = halRfReceivePacket(cc1101_dev.cc1101_buf, &count);  
  484.     if (0 != ret)  
  485.     {  
  486.         /* 
  487.         printk("cc1101 receiving .... start\n"); 
  488.         printk("cc1101 receiving .... end\n"); 
  489.         printk("cc1101 receiving %d bytes(s):%s\n", count, cc1101_dev.cc1101_buf); 
  490.         */  
  491.   
  492.         rcv_flag = 1;  
  493.         wake_up_interruptible(&cc1101_dev.read_wait);  
  494.     }  
  495.   
  496.     return IRQ_RETVAL(IRQ_HANDLED);  
  497. }  
  498.   
  499. static struct rcv_irq_desc cc1101_rcv_irq = {  
  500.     IRQ_EINT15,   
  501.     S3C2410_GPG7,   
  502.     S3C2410_GPG7_EINT15,   
  503.     "spi_GDO0"};  
  504.   
  505.   
  506. /*文件打开函数*/  
  507. int cc1101_open(struct inode *inode, struct file *filp)  
  508. {  
  509.     int ret;  
  510.       
  511.     ret = request_irq(cc1101_rcv_irq.irq, cc1101_rcv_interrupt, IRQ_TYPE_EDGE_FALLING,   
  512.                       cc1101_rcv_irq.name, (void *)&cc1101_rcv_irq);  
  513.     if (ret)  
  514.     {  
  515.         printk("request_irq error!\n");  
  516.         return -EBUSY;  
  517.     }  
  518.                   
  519.     return 0;  
  520. }  
  521.   
  522. /*写函数*/  
  523. static ssize_t cc1101_write(struct file *filp, const char __user *buf, size_t size, loff_t *ppos)  
  524. {  
  525.     unsigned int count = size;  
  526.     int ret = 0;  
  527.       
  528.     /*分析和获取有效的写长度*/  
  529.     if (CC1101_BUFLEN != size)    
  530.     {  
  531.         printk("cc1101 write wrong len:%d\n", size);  
  532.         return -ENOMEM;  
  533.     }  
  534.   
  535.     /*用户空间->内核空间*/  
  536.     if (copy_from_user(cc1101_dev.cc1101_buf, buf, count))  
  537.         ret =  - EFAULT;  
  538.     else  
  539.     {  
  540.         ret = count;  
  541.         //printk("kernel-space: cc1101 written %d bytes(s):%s\n", count, cc1101_dev.cc1101_buf);  
  542.     }  
  543.   
  544.     /* CC1101硬件发送 */  
  545.     //printk("kernel-space: cc1101 sending .... start\n");  
  546.     halRfSendPacket(cc1101_dev.cc1101_buf, count);  
  547.     //printk("kernel-space: cc1101 sending .... end\n");  
  548.   
  549.     return ret;  
  550. }  
  551.   
  552. /* 读函数 */  
  553. static ssize_t cc1101_waitqueue_read(struct file *filp, char __user *buf, size_t size, loff_t *ppos)  
  554. {  
  555.     unsigned int count = size;  
  556.     int ret = 0;  
  557.     DECLARE_WAITQUEUE(wait, current);  
  558.       
  559.     if (CC1101_BUFLEN != count)  
  560.     {  
  561.         printk("kernel-space: cc1101 read wrong len:%d\n", count);  
  562.         return -ENOMEM;  
  563.     }  
  564.   
  565.     add_wait_queue(&cc1101_dev.read_wait, &wait);  
  566.       
  567.     if (0 == rcv_flag)  
  568.     {  
  569.         if (filp->f_flags & O_NONBLOCK)  
  570.         {  
  571.             ret = -EAGAIN;  
  572.             goto out;  
  573.         }  
  574.   
  575.         __set_current_state(TASK_INTERRUPTIBLE);  
  576.         schedule();  
  577.         if (signal_pending(current))  
  578.         {  
  579.             ret =  - ERESTARTSYS;  
  580.             goto out;  
  581.         }  
  582.     }  
  583.   
  584.     /* 内核空间->用户空间 */  
  585.     copy_to_user(buf, cc1101_dev.cc1101_buf, count);  
  586.       
  587.     ret = count;  
  588.   
  589.     out:  
  590.         remove_wait_queue(&cc1101_dev.read_wait, &wait);  
  591.       
  592.     set_current_state(TASK_RUNNING);  
  593.     rcv_flag = 0;  
  594.     return ret;  
  595. }  
  596.   
  597. /* poll函数 */  
  598. static unsigned int cc1101_poll(struct file *filp, poll_table *wait)  
  599. {  
  600.     unsigned int mask = 0;  
  601.       
  602.     poll_wait(filp, &cc1101_dev.read_wait, wait);     
  603.   
  604.     if (1 == rcv_flag)  
  605.     {  
  606.         mask |= POLLIN | POLLRDNORM;  
  607.         printk("kernel-space: cc1101_poll rcv_flag = 1!\n");  
  608.     }  
  609.       
  610.     return mask;  
  611. }  
  612.   
  613. static int cc1101_close(struct inode *inode, struct file *file)  
  614. {  
  615.     free_irq(cc1101_rcv_irq.irq, (void *)&cc1101_rcv_irq);  
  616.   
  617.     printk("kernel-space: cc1101_close!\n");  
  618.     return 0;  
  619. }  
  620.   
  621. struct file_operations cc1101_fops =   
  622. {   
  623.     .owner = THIS_MODULE,  
  624.     .open = cc1101_open,  
  625.     .release = cc1101_close,  
  626.     .write = cc1101_write,  
  627.     .read = cc1101_waitqueue_read,  
  628.     .poll = cc1101_poll,  
  629. };  
  630.   
  631. /*初始化并注册cdev*/  
  632. static int cc1101_setup_cdev(void)  
  633. {  
  634.     int err;  
  635.   
  636.     cdev_init(&cc1101_dev.cdev, &cc1101_fops);    
  637.   
  638.     cc1101_dev.cdev.owner = THIS_MODULE;  
  639.     cc1101_dev.cdev.ops = &cc1101_fops;  
  640.   
  641.     err = cdev_add(&cc1101_dev.cdev, cc1101_dev_no, 1);  
  642.     if (err)  
  643.         printk("cc1101 cc1101_setup_cdev error!");  
  644.   
  645.     return err;  
  646. }  
  647.   
  648. static int __init cc1101_init(void)   
  649. {   
  650.     int ret = 0;  
  651.   
  652.     ret = Init_CC1100();  
  653.     if (0 != ret)  
  654.         goto init_fail;  
  655.   
  656.     ret = alloc_chrdev_region(&cc1101_dev_no, 0, 1, "cc1101");  
  657.     if (0 < ret)  
  658.         goto init_fail;  
  659.   
  660.     init_waitqueue_head(&cc1101_dev.read_wait);  
  661.       
  662.     ret = cc1101_setup_cdev();  
  663.     if (0 != ret)  
  664.     {  
  665.         unregister_chrdev_region(cc1101_dev_no, 1);   
  666.         goto init_fail;  
  667.     }  
  668.   
  669.     printk("cc1101 init success!\n");  
  670.     return 0;  
  671.   
  672.     init_fail:  
  673.         printk("cc1101 init failed!\n");  
  674.           
  675.     return ret;  
  676. }   
  677.   
  678. static void  __exit cc1101_exit(void)   
  679. {   
  680.     unregister_chrdev_region(cc1101_dev_no, 1);   
  681.     cdev_del(&cc1101_dev.cdev);   
  682.     printk("cc1101 exit success!\n");  
  683. }  
  684.   
  685. module_init(cc1101_init);  
  686. module_exit(cc1101_exit);  
  687.   
  688. MODULE_LICENSE("GPL");  
  689. MODULE_AUTHOR("forsakening-hdu");  
  690. MODULE_DESCRIPTION("cc1101 control for EmbedSky TQ2440 Board"); 

linux 驱动cc1101

标签:

原文地址:http://www.cnblogs.com/zym0805/p/4397652.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!