newton:add irda MIR mode
authorlyx <lyx@rock-chips.com>
Tue, 5 Jul 2011 10:05:25 +0000 (03:05 -0700)
committerlyx <lyx@rock-chips.com>
Fri, 8 Jul 2011 06:07:19 +0000 (23:07 -0700)
Now irda can work under MIR mode, FIR mode is still terrible.

drivers/net/irda/bu92725guw.c
drivers/net/irda/bu92725guw.h
drivers/net/irda/rk29_ir.c

index b1794b3517e26e6d040db31e536bdf90b0a6f125..78340f7d45f5bbf8acb523dd3962d74937d12c8b 100755 (executable)
@@ -51,7 +51,7 @@
 */\r
 static u32 curTrans_mode;  /* SIR, MIR, FIR */\r
 static u32 curTrans_speed; /* 2.4kbps, 9.6kbps,..., 4Mbps */\r
-static u32 curTrans_way;   /* idle, send, receive, auto-multi-receive, multi-receive, multi-send */\r
+static u32 curTrans_way;   /* idle, send, receive, mir-receive, mir-send, fir-receive, fir-send, auto-multi-receive, multi-receive, multi-send */\r
 static u16 curFIT;         /* FIT2,1,0 in PWR/FIT register */\r
 \r
 /*---------------------------------------------------------------------------\r
@@ -189,25 +189,49 @@ int irda_hw_set_speed(u32 speed)
        case BU92725GUW_IDLE:\r
                break;\r
        case BU92725GUW_REV:\r
-               if (mode != BU92725GUW_SIR)\r
-                       curTrans_way = BU92725GUW_AUTO_MULTI_REV;\r
+               if (mode == BU92725GUW_MIR)\r
+                       curTrans_way = BU92725GUW_MIR_REV;\r
+               else if (mode == BU92725GUW_FIR)\r
+                       //curTrans_way = BU92725GUW_AUTO_MULTI_REV;\r
                        //curTrans_way = BU92725GUW_MULTI_REV;\r
+                       curTrans_way = BU92725GUW_FIR_REV;\r
                break;\r
        case BU92725GUW_SEND:\r
-               if (mode != BU92725GUW_SIR)\r
-                       curTrans_way = BU92725GUW_MULTI_SEND;\r
+               if (mode == BU92725GUW_MIR)\r
+                       curTrans_way = BU92725GUW_MIR_SEND;\r
+               else if (mode == BU92725GUW_FIR)\r
+                       //curTrans_way = BU92725GUW_MULTI_SEND;\r
+                       curTrans_way = BU92725GUW_FIR_SEND;\r
                break;\r
-       case BU92725GUW_AUTO_MULTI_REV:\r
+       case BU92725GUW_MIR_REV:\r
                if (mode == BU92725GUW_SIR)\r
                        curTrans_way = BU92725GUW_REV;\r
+               else if (mode == BU92725GUW_FIR)\r
+                       //curTrans_way = BU92725GUW_AUTO_MULTI_REV;\r
+                       //curTrans_way = BU92725GUW_MULTI_REV;\r
+                       curTrans_way = BU92725GUW_FIR_REV;\r
+               break;\r
+       case BU92725GUW_MIR_SEND:\r
+               if (mode == BU92725GUW_SIR)\r
+                       curTrans_way = BU92725GUW_SEND;\r
+               else if (mode == BU92725GUW_FIR)\r
+                       //curTrans_way = BU92725GUW_MULTI_SEND;\r
+                       curTrans_way = BU92725GUW_FIR_SEND;\r
                break;\r
-       case BU92725GUW_MULTI_REV: //not used now\r
+       case BU92725GUW_FIR_REV:\r
+       case BU92725GUW_AUTO_MULTI_REV:\r
+       case BU92725GUW_MULTI_REV:\r
                if (mode == BU92725GUW_SIR)\r
                        curTrans_way = BU92725GUW_REV;\r
+               else if (mode == BU92725GUW_MIR)\r
+                       curTrans_way = BU92725GUW_MIR_REV;\r
                break;\r
+       case BU92725GUW_FIR_SEND:\r
        case BU92725GUW_MULTI_SEND:\r
                if (mode == BU92725GUW_SIR)\r
                        curTrans_way = BU92725GUW_SEND;\r
+               else if (mode == BU92725GUW_MIR)\r
+                       curTrans_way = BU92725GUW_MIR_SEND;\r
                break;\r
        }\r
 \r
@@ -233,9 +257,11 @@ int irda_hw_tx_enable_irq(enum eTrans_Mode mode)
        */\r
        if (mode == BU92725GUW_SIR)\r
                BU92725GUW_set_trans_way(BU92725GUW_SEND);\r
+       else if (mode == BU92725GUW_MIR)\r
+               BU92725GUW_set_trans_way(BU92725GUW_MIR_SEND);\r
        else\r
-               BU92725GUW_set_trans_way(BU92725GUW_MULTI_SEND);\r
-\r
+               //BU92725GUW_set_trans_way(BU92725GUW_MULTI_SEND);\r
+               BU92725GUW_set_trans_way(BU92725GUW_FIR_SEND);\r
        //BU92725GUW_clr_fifo();\r
 \r
     return 0;\r
@@ -289,20 +315,24 @@ void irda_hw_set_moderx(void)
 \r
        if (curTrans_mode == BU92725GUW_SIR)\r
                BU92725GUW_set_trans_way(BU92725GUW_REV);\r
+       else if (curTrans_mode == BU92725GUW_MIR)\r
+               BU92725GUW_set_trans_way(BU92725GUW_MIR_REV);\r
        else\r
-               BU92725GUW_set_trans_way(BU92725GUW_AUTO_MULTI_REV);\r
+               //BU92725GUW_set_trans_way(BU92725GUW_AUTO_MULTI_REV);\r
                //BU92725GUW_set_trans_way(BU92725GUW_MULTI_REV);\r
+               BU92725GUW_set_trans_way(BU92725GUW_FIR_REV);\r
 }\r
 \r
 int irda_hw_get_mode(void)\r
 {\r
        return curTrans_way;\r
-               \r
+#if    0       \r
     u16 val = 0;\r
     val = BU92725GUW_READ_REG(REG_TRCR_ADDR);\r
        RK29IR_DBG("line %d: enter %s, REG_TRCR_ADDR = 0x%x\n", __LINE__, __FUNCTION__, val);\r
 \r
     return (val& (REG_TRCR_TX_EN | REG_TRCR_RX_EN));\r
+#endif\r
 }\r
 \r
 /*\r
@@ -363,7 +393,8 @@ u16 BU92725GUW_get_data(u8 *buf)
        RK29IR_DBG("line %d: enter %s\n", __LINE__, __FUNCTION__);\r
 \r
        /* get data count from FLV or FLVII */\r
-       if (curTrans_way == BU92725GUW_REV)\r
+       if ((curTrans_way == BU92725GUW_REV) || (curTrans_way == BU92725GUW_MIR_REV)\r
+               || (curTrans_way == BU92725GUW_FIR_REV))\r
                len = BU92725GUW_READ_REG(REG_FLV_ADDR);\r
        else\r
                len = BU92725GUW_READ_REG(REG_FLVII_ADDR);\r
@@ -378,7 +409,8 @@ u16 BU92725GUW_get_data(u8 *buf)
        }\r
 \r
         /* restart receive mode under SIR */\r
-       if (curTrans_way == BU92725GUW_REV) {\r
+       if ((curTrans_way == BU92725GUW_REV) || (curTrans_way == BU92725GUW_MIR_REV)\r
+               || (curTrans_way == BU92725GUW_FIR_REV)){\r
                BU92725GUW_WRITE_REG(REG_TRCR_ADDR, 0x0000);\r
                BU92725GUW_WRITE_REG(REG_TRCR_ADDR, REG_TRCR_RX_EN);\r
        }\r
@@ -414,7 +446,8 @@ u16 BU92725GUW_get_data(u8 *buf)
        BU92725GUW_WRITE_REG(REG_FTLV_ADDR, len);\r
 \r
        /* set TRCR:TX_EN under normal send mode */\r
-       if (curTrans_way == BU92725GUW_SEND)  {//SIR\r
+       if ((curTrans_way == BU92725GUW_SEND) || (curTrans_way == BU92725GUW_MIR_SEND)\r
+               || (curTrans_way == BU92725GUW_FIR_SEND))  {\r
                BU92725GUW_WRITE_REG(REG_TRCR_ADDR, REG_TRCR_TX_EN);\r
        }\r
 \r
@@ -633,17 +666,21 @@ static void internal_set(u8 modeChg)
                val = 0x0000;\r
                break;\r
        case BU92725GUW_REV:\r
+       case BU92725GUW_MIR_REV: \r
+       case BU92725GUW_FIR_REV:\r
                val = REG_TRCR_RX_EN;\r
                break;\r
-       case BU92725GUW_SEND:\r
-               val = 0x0000;\r
-               break;\r
        case BU92725GUW_AUTO_MULTI_REV:\r
                val = REG_TRCR_RX_EN | REG_TRCR_AUTO_FLV_CP;\r
                break;\r
-       case BU92725GUW_MULTI_REV: //not used\r
-               val = REG_TRCR_RX_EN | REG_TRCR_RX_CON;\r
+       case BU92725GUW_MULTI_REV: \r
+               val = REG_TRCR_RX_EN | REG_TRCR_RX_CON;//FIR\r
                break;\r
+       case BU92725GUW_SEND:\r
+       case BU92725GUW_MIR_SEND:\r
+       case BU92725GUW_FIR_SEND:\r
+               val = 0x0000;\r
+               break;          \r
        case BU92725GUW_MULTI_SEND:\r
                val = REG_TRCR_TX_CON;\r
                break;\r
@@ -660,20 +697,35 @@ static void internal_set(u8 modeChg)
        case BU92725GUW_REV: /* SIR use */\r
                val = REG_INT_EOFRX | REG_INT_TO | REG_INT_OE | REG_INT_FE; //IER1, 2, 5, 7\r
                break;\r
-\r
-       case BU92725GUW_SEND: /* SIR use */\r
-               val = REG_INT_TXE; //IER3\r
+               \r
+       case BU92725GUW_MIR_REV: /* MIR use */\r
+               val = REG_INT_STFRX | REG_INT_TO | REG_INT_OE | REG_INT_EOF \r
+                       | REG_INT_AC | REG_INT_DECE; //IER1,2, 5, 6, 7\r
                break;\r
-\r
+               \r
+       case BU92725GUW_FIR_REV: /* FIR use */\r
+               val = REG_INT_STFRX | REG_INT_TO | REG_INT_CRC | REG_INT_OE | REG_INT_EOF \r
+                       | REG_INT_AC | REG_INT_DECE; //IER1,2, 4, 5, 6, 7\r
+               break;\r
+               \r
        case BU92725GUW_MULTI_REV: /* not used */\r
                val = REG_INT_STFRX | REG_INT_TO | REG_INT_CRC | REG_INT_OE | REG_INT_EOF | REG_INT_AC | REG_INT_DECE | \r
                          REG_INT_RDOE | REG_INT_DEX | REG_INT_RDUE; //IER1,2, 4, 5, 6, 7, 8, 9, 10\r
                break;\r
-\r
+       \r
        case BU92725GUW_AUTO_MULTI_REV: /* M/FIR use */\r
                val = REG_INT_TO | REG_INT_CRC | REG_INT_OE | REG_INT_EOF | REG_INT_AC | REG_INT_DECE | \r
                          REG_INT_RDOE | REG_INT_DEX | REG_INT_RDE; //IER2, 4, 5, 6, 7, 8, 9, 12\r
                break;\r
+               \r
+       case BU92725GUW_SEND: /* SIR use */\r
+               val = REG_INT_TXE; //IER3\r
+               break;\r
+               \r
+       case BU92725GUW_MIR_SEND:\r
+       case BU92725GUW_FIR_SEND:\r
+               val = REG_INT_TXE | REG_INT_TO; //IER2, 3\r
+               break;  \r
 \r
        case BU92725GUW_MULTI_SEND: /* M/FIR use */\r
                val = REG_INT_TO | REG_INT_TXE | REG_INT_WRE; //IER2, 3, 11\r
@@ -681,6 +733,7 @@ static void internal_set(u8 modeChg)
        }\r
        BU92725GUW_WRITE_REG(REG_IER_ADDR, val);\r
        RK29IR_DBG("REG_IER_ADDR: 0x%x\n", val);\r
+       \r
 }\r
 \r
 \r
index cee61bc85ad060da28016ba71a38aea6fe4493ce..890fef97bd6f7e72446e7d88fbf42c62533ec7bf 100755 (executable)
@@ -162,6 +162,10 @@ enum eThrans_Way {
        BU92725GUW_IDLE = 0,\r
        BU92725GUW_REV, /* SIR use */\r
        BU92725GUW_SEND, /* SIR use */\r
+       BU92725GUW_MIR_REV, /* MIR use */\r
+       BU92725GUW_MIR_SEND, /* MIR use */\r
+       BU92725GUW_FIR_REV, /* FIR use */\r
+       BU92725GUW_FIR_SEND, /* FIR use */\r
        BU92725GUW_AUTO_MULTI_REV, /* M/FIR use */\r
        BU92725GUW_MULTI_REV, /* not used */\r
        BU92725GUW_MULTI_SEND, /* M/FIR use */\r
index b7454d896c143a5b64d8e17f442a78c7e1a93597..64fe7ea4249096a42ff7a90198f128021c5e28aa 100755 (executable)
@@ -59,7 +59,7 @@ struct irda_driver {
 };\r
 \r
 #define IS_FIR(si)             ((si)->speed >= 4000000)\r
-static int max_rate = 115200;\r
+static int max_rate = 4000000;\r
 #define IRDA_FRAME_SIZE_LIMIT  BU92725GUW_FIFO_SIZE\r
 \r
 #define RK29_MAX_RXLEN 2047\r
@@ -123,8 +123,8 @@ static int rk29_irda_set_speed(struct rk29_irda *si, int speed)
 \r
                si->speed = speed;\r
                \r
-               irda_hw_set_speed(speed);\r
-               \r
+               //irda_hw_set_speed(speed);\r
+               irda_hw_set_speed(1152000);//MIR\r
                rk29_irda_rx_alloc(si);\r
 \r
                local_irq_restore(flags);\r
@@ -154,10 +154,11 @@ static irqreturn_t rk29_irda_irq(int irq, void *dev_id)
        \r
        //disable_irq(dev->irq);\r
    \r
-        /* EIR 1, 3, 11, 12 */\r
+        /* EIR 1, 3, 11, 12 \r
        irda_setptn |= irq_src & (REG_INT_EOFRX | REG_INT_TXE | REG_INT_WRE | REG_INT_RDE |\r
                                  REG_INT_CRC | REG_INT_OE | REG_INT_FE | REG_INT_AC | \r
-                                 REG_INT_DECE | REG_INT_RDOE | REG_INT_DEX) ;\r
+                                 REG_INT_DECE | REG_INT_RDOE | REG_INT_DEX) ;*/\r
+       irda_setptn = irq_src;\r
 \r
        /* error */\r
        if (irq_src & (REG_INT_TO| REG_INT_CRC | REG_INT_OE | REG_INT_FE | \r
@@ -170,7 +171,7 @@ static irqreturn_t rk29_irda_irq(int irq, void *dev_id)
     if (IS_FIR(si))  //FIR\r
     {\r
         RK29IR_DBG("[%s][%d]: FIR\n",__FUNCTION__,__LINE__);\r
-        if(irda_hw_get_mode() == BU92725GUW_AUTO_MULTI_REV) {//rx\r
+        if(irda_hw_get_mode() == BU92725GUW_MIR_REV) {//rx\r
                        struct sk_buff *skb = si->rxskb;\r
             RK29IR_DBG("[%s][%d]: rx\n",__FUNCTION__,__LINE__);\r
             if (irda_setptn & (REG_INT_FE | REG_INT_OE | REG_INT_CRC | REG_INT_DECE)) {\r
@@ -182,11 +183,11 @@ static irqreturn_t rk29_irda_irq(int irq, void *dev_id)
                     dev->stats.rx_errors++;\r
                 }\r
             }\r
-            if ((irda_setptn & (FRM_EVT_RX_EOFRX | FRM_EVT_RX_RDE | REG_INT_EOF))) {\r
+            if (irda_setptn & FRM_EVT_RX_EOFRX) {\r
                                tmp_len = BU92725GUW_get_data(skb->data+skb->len);\r
                                skb->len += tmp_len;                    \r
             }\r
-                       if (irda_setptn & (REG_INT_EOF | FRM_EVT_RX_EOFRX)) {                           \r
+                       if (irda_setptn & REG_INT_EOF) {                                \r
                                RK29IR_DBG("[%s][%d]: report data:\n",__FUNCTION__,__LINE__);\r
                                si->rxskb = NULL;\r
                                RK29IR_DATA_DBG("[%s][%d]: fir report data:\n",__FUNCTION__,__LINE__);\r
@@ -212,11 +213,11 @@ static irqreturn_t rk29_irda_irq(int irq, void *dev_id)
                                netif_rx(skb);\r
                        }                                               \r
         }\r
-               else if (irda_hw_get_mode() == BU92725GUW_MULTI_SEND) {//tx\r
+               else if (irda_hw_get_mode() == BU92725GUW_MIR_SEND) {//tx\r
                        struct sk_buff *skb = si->txskb;                        \r
                        si->txskb = NULL;\r
             RK29IR_DBG("[%s][%d]: tx\n",__FUNCTION__,__LINE__);\r
-            if (irda_setptn & (FRM_EVT_TX_TXE | FRM_EVT_TX_WRE)) {\r
+            if (irda_setptn & FRM_EVT_TX_TXE) {\r
                                /*\r
                                 * Do we need to change speed?  Note that we're lazy\r
                                 * here - we don't free the old rxskb.  We don't need\r
@@ -471,13 +472,12 @@ static int rk29_irda_hard_xmit(struct sk_buff *skb, struct net_device *dev)
                dev->trans_start = jiffies;\r
                BU92725GUW_send_data(si->tx_buff.data, si->tx_buff.len, NULL, 0);\r
                si->tx_buff.len = 0;\r
-\r
     } \r
        else {\r
         unsigned long mtt = irda_get_mtt(skb);\r
                si->txskb = skb;\r
        \r
-          irda_hw_tx_enable_irq(BU92725GUW_FIR);\r
+          irda_hw_tx_enable_irq(BU92725GUW_MIR);\r
 \r
          RK29IR_DATA_DBG("[%d][%s], fir transmit data:\n", __LINE__, __FUNCTION__);\r
          for (i=0;i<skb->len;i++) {\r