Hi, colleagues, Can one please send me (or to the list) the final version of this patch, so I can apply it?
On 7/28/10, Xue Liu <[email protected]> wrote: > 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 > -- With best wishes Dmitry ------------------------------------------------------------------------------ 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
