On 07/28/10 13:00, xue liu wrote:
> * Add cc2420_write_ram() function
> * Add cc2420_set_hw_addr_filt() function
> * Implement cc2420_ed()
> * Close cc2420 address decode
> * Delte useless comments
Delete

Otherwise please clarify the comment I have highlighted below.

Looks good to me with those to done so add,

Acked-by: Jonathan Cameron <[email protected]>

Thanks,
> * Update my profile
> 
> Signed-off-by: xue liu <[email protected]>
> ---
>  drivers/ieee802154/cc2420.c |  159 
> +++++++++++++++++++++++++++++++++++--------
>  include/linux/spi/cc2420.h  |    2 +-
>  2 files changed, 132 insertions(+), 29 deletions(-)
> 
> diff --git a/drivers/ieee802154/cc2420.c b/drivers/ieee802154/cc2420.c
> index 7839ddb..c1f64b3 100644
> --- a/drivers/ieee802154/cc2420.c
> +++ b/drivers/ieee802154/cc2420.c
> @@ -14,7 +14,7 @@
>   *
>   * Author:   Jonathan Cameron <[email protected]>
>   *
> - * Modified 2010:    liuxue <[email protected]>
> + * Modified 2010:    xue liu <[email protected]>
>   */
>  
>  #include <linux/kernel.h>
> @@ -34,22 +34,45 @@
>  
>  #define CC2420_WRITEREG(x) (x)
>  #define CC2420_READREG(x) (0x40 | x)
> +#define CC2420_RAMADDR(x) ((x & 0x7F) | 0x80)
> +#define CC2420_RAMBANK(x) ((x >> 1) & 0xc0)
> +#define CC2420_WRITERAM(x) (x)
> +#define CC2420_READRAM(x) (0x20 | x)
>  
>  #define CC2420_FREQ_MASK             0x3FF
>  #define CC2420_ADR_DECODE_MASK       0x0B00
>  #define CC2420_FIFOP_THR_MASK        0x003F
>  #define CC2420_CRC_MASK                      0x80
> +#define CC2420_RSSI_MASK             0x7F
> +#define CC2420_FSMSTATE_MASK 0x2F
>  
>  #define CC2420_MANFIDLOW     0x233D
>  #define CC2420_MANFIDHIGH    0x3000 /* my chip appears to version 3 - 
> broaden this with testing */
>  
> +#define RSSI_OFFSET 45
> +
>  #define STATE_PDOWN 0
>  #define STATE_IDLE  1
> -#define STATE_RX_CALIB 2
> -#define STATE_RX_CALIB2 40
> +#define STATE_RX_CALIBRATE           2
> +#define STATE_RX_CALIBRATE2          40
>  
>  #define STATE_RX_SFD_SEARCH_MIN 3
>  #define STATE_RX_SFD_SEARCH_MAX 6
> +#define STATE_RX_FRAME                       16
> +#define STATE_RX_FRAME2                      40
> +#define STATE_RX_WAIT                        14
> +#define STATE_RX_OVERFLOW            17
> +#define STATE_TX_ACK_CALIBRATE       48
> +#define STATE_TX_ACK_PREAMBLE_MIN    49
> +#define STATE_TX_ACK_PREAMBLE_MAX    51
> +#define STATE_TX_ACK_MIN                     52
> +#define STATE_TX_ACK_MAX                     54
> +#define STATE_TX_CALIBRATE                   32
> +#define STATE_TX_PREAMBLE_MIN                34
> +#define STATE_TX_PREAMBLE_MAX                36
> +#define STATE_TX_FRAME_MIN                   37
> +#define STATE_TX_FRAME_MAX                   39
> +#define STATE_TX_UNDERFLOW                   56
>  
>  struct cc2420_local {
>       struct cc2420_platform_data *pdata;
> @@ -168,10 +191,6 @@ static int cc2420_write_16_bit_reg_partial(struct 
> cc2420_local *lp,
>  
>       lp->buf[0] = CC2420_WRITEREG(addr);
>  
> -     //dev_vdbg(&lp->spi->dev, "test: ~(mask >> 8) | (data >> 8) = %x\n", 
> ~(mask >> 8) | (data >> 8));
> -     //dev_vdbg(&lp->spi->dev, "test: ~(mask & 0xFF) | (data & 0xFF) = 
> %x\n", ~(mask & 0xFF) | (data & 0xFF));
> -     //lp->buf[1] &= ~(mask >> 8) | (data >> 8);
> -     //lp->buf[2] &= ~(mask & 0xFF) | (data & 0xFF);
>       lp->buf[1] &= ~(mask >> 8);
>       lp->buf[2] &= ~(mask & 0xFF);
>       lp->buf[1] |= (mask >> 8) & (data >> 8);
> @@ -191,8 +210,7 @@ err_ret:
>       return ret;
>  }
>  
> -static int
> -cc2420_channel(struct ieee802154_dev *dev, int channel)
> +static int cc2420_channel(struct ieee802154_dev *dev, int channel)
>  {
>       struct cc2420_local *lp = dev->priv;
>       int ret;
> @@ -209,8 +227,42 @@ cc2420_channel(struct ieee802154_dev *dev, int channel)
>       return ret;
>  }
>  
> -static int
> -cc2420_write_txfifo(struct cc2420_local *lp, u8 *data, u8 len)
> +static int cc2420_write_ram(struct cc2420_local *lp, u16 addr, u8 len, u8 
> *data)
> +{
> +     int status;
> +     struct spi_message msg;
> +     struct spi_transfer xfer_head = {
> +             .len            = 2,
> +             .tx_buf         = lp->buf,
> +             .rx_buf         = lp->buf,
> +     };
> +     struct spi_transfer xfer_buf = {
> +             .len            = len,
> +             .tx_buf         = data,
> +     };
> +
> +     mutex_lock(&lp->bmux);
> +     lp->buf[0] = CC2420_RAMADDR(addr);
> +     lp->buf[1] = CC2420_WRITERAM(CC2420_RAMBANK(addr));
> +     dev_dbg(&lp->spi->dev, "write ram addr buf[0] = %02x\n", lp->buf[0]);
> +     dev_dbg(&lp->spi->dev, "ram bank buf[1] = %02x\n", lp->buf[1]);
> +
> +     spi_message_init(&msg);
> +     spi_message_add_tail(&xfer_head, &msg);
> +     spi_message_add_tail(&xfer_buf, &msg);
> +
> +     status = spi_sync(lp->spi, &msg);
> +     dev_dbg(&lp->spi->dev, "spi status = %d\n", status);
> +     if (msg.status)
> +             status = msg.status;
> +     dev_dbg(&lp->spi->dev, "cc2420 status = %02x\n", lp->buf[0]);
> +     dev_dbg(&lp->spi->dev, "buf[1] = %02x\n", lp->buf[1]);
> +
> +     mutex_unlock(&lp->bmux);
> +     return status;
> +}
> +
> +static int cc2420_write_txfifo(struct cc2420_local *lp, u8 *data, u8 len)
>  {
>       int status;
>       /* Length byte must include FCS even if calculated in hardware */
> @@ -291,8 +343,7 @@ cc2420_read_rxfifo(struct cc2420_local *lp, u8 *data, u8 
> *len, u8 *lqi)
>  }
>  
>  
> -static int
> -cc2420_tx(struct ieee802154_dev *dev, struct sk_buff *skb)
> +static int cc2420_tx(struct ieee802154_dev *dev, struct sk_buff *skb)
>  {
>       struct cc2420_local *lp = dev->priv;
>       int rc;
> @@ -379,22 +430,74 @@ static int cc2420_rx(struct cc2420_local *lp)
>  }
>  
>  static int
> -cc2420_ed(struct ieee802154_dev *dev, u8 *level)
> +cc2420_set_hw_addr_filt(struct ieee802154_dev *dev,
> +                                             struct ieee802154_hw_addr_filt 
> *filt,
> +                                             unsigned long changed)
>  {
>       struct cc2420_local *lp = dev->priv;
> -     dev_dbg(&lp->spi->dev, "ed called\n");
> -     *level = 0xbe;
> +     u16 reg;
> +
> +     might_sleep();
> +
> +     if (changed & IEEE802515_IEEEADDR_CHANGED)
> +             cc2420_write_ram(lp, CC2420_RAM_IEEEADR,
> +                                              IEEE802154_ADDR_LEN,
> +                                              filt->ieee_addr);
> +
> +     if (changed & IEEE802515_SADDR_CHANGED) {
> +             u8 short_addr[2];
> +             short_addr[0] = filt->short_addr & 0xff;/* LSB */
> +             short_addr[1] = filt->short_addr >> 8;  /* MSB */
> +             cc2420_write_ram(lp, CC2420_RAM_SHORTADR,
> +                                              sizeof(short_addr),
> +                                              short_addr);
> +     }
> +
> +     if (changed & IEEE802515_PANID_CHANGED) {
> +             u8 panid[2];
> +             panid[0] = filt->pan_id & 0xff; /* LSB */
> +             panid[1] = filt->pan_id >> 8;   /* MSB */
> +             cc2420_write_ram(lp, CC2420_RAM_PANID,
> +                                              sizeof(panid),
> +                                              panid);
> +     }
> +
> +     if (changed & IEEE802515_PANC_CHANGED) {
> +             cc2420_read_16_bit_reg(lp, CC2420_MDMCTRL0, &reg);
> +             if (filt->pan_coord)
> +                     reg |= 1 << CC2420_MDMCTRL0_PANCRD;
> +             else
> +                     reg &= ~(1 << CC2420_MDMCTRL0_PANCRD);
> +             cc2420_write_16_bit_reg_partial(lp, CC2420_MDMCTRL0,
> +                                                                             
> reg, 1 << CC2420_MDMCTRL0_PANCRD);
> +     }
> +
>       return 0;
>  }
>  
> -static int
> -cc2420_start(struct ieee802154_dev *dev)
> +static int cc2420_ed(struct ieee802154_dev *dev, u8 *level)
> +{
> +     struct cc2420_local *lp = dev->priv;
> +     u16 rssi;
> +     int ret;
> +     dev_dbg(&lp->spi->dev, "ed called\n");
> +
> +     /* You should know *data present a signed number */
What is *data?  I don't understand this comment I'm afraid.
> +     ret = cc2420_read_16_bit_reg(lp, CC2420_RSSI, &rssi);
> +     if (ret)
> +             return ret;
> +
> +     /* P = RSSI_VAL + RSSI_OFFSET[dBm] */
> +     *level = (rssi & CC2420_RSSI_MASK) + RSSI_OFFSET;
> +     return ret;
> +}
> +
> +static int cc2420_start(struct ieee802154_dev *dev)
>  {
>       return cc2420_cmd_strobe(dev->priv, CC2420_SRXON);
>  }
>  
> -static void
> -cc2420_stop(struct ieee802154_dev *dev)
> +static void cc2420_stop(struct ieee802154_dev *dev)
>  {
>       cc2420_cmd_strobe(dev->priv, CC2420_SRFOFF);
>  }
> @@ -406,6 +509,7 @@ static struct ieee802154_ops cc2420_ops = {
>       .start          = cc2420_start,
>       .stop           = cc2420_stop,
>       .set_channel = cc2420_channel,
> +     .set_hw_addr_filt = cc2420_set_hw_addr_filt,
>  };
>  
>  static int cc2420_register(struct cc2420_local *lp)
> @@ -431,6 +535,7 @@ static int cc2420_register(struct cc2420_local *lp)
>       ret = ieee802154_register_device(lp->dev);
>       if (ret)
>               goto err_free_device;
> +
>       return 0;
>  err_free_device:
>       ieee802154_free_device(lp->dev);
> @@ -456,7 +561,6 @@ static irqreturn_t cc2420_isr(int irq, void *data)
>       }
>       spin_unlock(&lp->lock);
>  
> -     /* pin or value? */
>       if (irq == lp->sfd_irq)
>               schedule_work(&lp->sfd_irqwork);
>  
> @@ -678,9 +782,6 @@ static int __devinit cc2420_probe(struct spi_device *spi)
>               goto err_free_sfd_irq;
>       }
>  
> -     dev_dbg(&lp->spi->dev, "Disable hardware address decoding\n");
> -     cc2420_write_16_bit_reg_partial(lp, CC2420_MDMCTRL0,
> -                                     0, 1 << CC2420_MDMCTRL0_ADRDECODE);
>       dev_info(&lp->spi->dev, "Set fifo threshold to 127\n");
>       cc2420_write_16_bit_reg_partial(lp, CC2420_IOCFG0, 127, 
> CC2420_FIFOP_THR_MASK);
>       ret = cc2420_register(lp);
> @@ -689,9 +790,9 @@ static int __devinit cc2420_probe(struct spi_device *spi)
>  
>       return 0;
>  err_free_sfd_irq:
> -     free_irq(gpio_to_irq(lp->pdata->sfd), lp);
> +     free_irq(lp->sfd_irq, lp);
>  err_free_fifop_irq:
> -     free_irq(gpio_to_irq(lp->pdata->fifop), lp);
> +     free_irq(lp->fifop_irq, lp);
>  err_disable_vreg:
>       gpio_set_value(lp->pdata->vreg, 0);
>  err_free_gpio_vreg:
> @@ -719,8 +820,10 @@ static int __devexit cc2420_remove(struct spi_device 
> *spi)
>       struct cc2420_local *lp = spi_get_drvdata(spi);
>  
>       cc2420_unregister(lp);
> -     free_irq(gpio_to_irq(lp->pdata->fifop), lp);
> -     free_irq(gpio_to_irq(lp->pdata->sfd), lp);
> +     free_irq(lp->fifop_irq, lp);
> +     free_irq(lp->sfd_irq, lp);
> +     flush_work(&lp->fifop_irqwork);
> +     flush_work(&lp->sfd_irqwork);
>       gpio_free(lp->pdata->vreg);
>       gpio_free(lp->pdata->reset);
>       gpio_free(lp->pdata->sfd);
> diff --git a/include/linux/spi/cc2420.h b/include/linux/spi/cc2420.h
> index 79b699d..5db3d58 100644
> --- a/include/linux/spi/cc2420.h
> +++ b/include/linux/spi/cc2420.h
> @@ -14,7 +14,7 @@
>   *
>   * Author:   Jonathan Cameron <[email protected]>
>   *
> - * Modified 2010:    liuxue <[email protected]>
> + * Modified 2010:    xue liu <[email protected]>
>   */
>  
>  #ifndef __CC2420_H


------------------------------------------------------------------------------
The Palm PDK Hot Apps Program offers developers who use the
Plug-In Development Kit to bring their C/C++ apps to Palm for a share 
of $1 Million in cash or HP Products. Visit us here for more details:
http://ad.doubleclick.net/clk;226879339;13503038;l?
http://clk.atdmt.com/CRS/go/247765532/direct/01/
_______________________________________________
Linux-zigbee-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/linux-zigbee-devel

Reply via email to