Hi, Jonathan
2010/7/28 Jonathan Cameron <[email protected]>
> 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, ®);
> > + 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.
>
Sorry, I made a mistake. *data should replace with rssi.
> > + 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
>
> regard
xue liu
------------------------------------------------------------------------------
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://p.sf.net/sfu/dev2dev-palm
_______________________________________________
Linux-zigbee-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/linux-zigbee-devel