From 6a879bd5b01fe5ede40d39080c46a600e9e01fff Mon Sep 17 00:00:00 2001 From: Brad Campbell Date: Fri, 13 Sep 2013 02:15:04 -0400 Subject: [PATCH 1/2] .cmd files --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index 2be0d54..b7d8491 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,4 @@ +*.cmd *.ko.cmd *.mod.c *.mod.o From ed41758daae535e2c970a219200e6d81bfcafb98 Mon Sep 17 00:00:00 2001 From: Brad Campbell Date: Sat, 21 Sep 2013 13:38:17 -0400 Subject: [PATCH 2/2] Updated with newest version of rasbian Also a few things with comments and debugging printf. --- README.md | 2 +- cc2520.ko | Bin 39094 -> 43864 bytes debug.h | 2 +- module.c | 8 +-- patches/bcm2708.patch | 4 +- patches/spi-bcm2708.patch | 100 +++++++++++++++++++++++--------------- 6 files changed, 68 insertions(+), 48 deletions(-) diff --git a/README.md b/README.md index b1f8cd4..db18c6c 100644 --- a/README.md +++ b/README.md @@ -17,7 +17,7 @@ To compile you'll need an ARM cross compiler and the source tree of a compiled ARM kernel. Update the Makefile to point to your kernel source, and run the following command: -make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- + make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- Please note that we're cross-compiling from an x86 machine. diff --git a/cc2520.ko b/cc2520.ko index a312ca3c9cf5d7fa9f2e3d0e8d4027409786b893..58bb9e3058f56293665691df0532b31718439a1a 100644 GIT binary patch literal 43864 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 literal 39094 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 G`M&^9kN}7P diff --git a/debug.h b/debug.h index 3743a20..59e3a69 100644 --- a/debug.h +++ b/debug.h @@ -9,7 +9,7 @@ #define DEBUG_PRINT_ERR 1 // print occasional messages about interesting things #define DEBUG_PRINT_INFO 2 -// print a good amount of debuging output +// print a good amount of debugging output #define DEBUG_PRINT_DBG 3 // Defines the level of debug output diff --git a/module.c b/module.c index 69f8f03..8f55119 100644 --- a/module.c +++ b/module.c @@ -20,7 +20,7 @@ #include "debug.h" #define DRIVER_AUTHOR "Andrew Robinson " -#define DRIVER_DESC "A driver for the CC2520 radio. Be afraid." +#define DRIVER_DESC "A driver for the CC2520 radio." #define DRIVER_VERSION "0.5" uint8_t debug_print; @@ -58,7 +58,7 @@ int init_module() memset(&state, 0, sizeof(struct cc2520_state)); - INFO((KERN_INFO "loading CC2520 Kernel Module v%s...\n", DRIVER_VERSION)); + INFO((KERN_INFO "[CC2520] - Loading kernel module v%s\n", DRIVER_VERSION)); err = cc2520_plat_gpio_init(); if (err) { @@ -127,7 +127,7 @@ int init_module() error6: cc2520_plat_gpio_free(); error7: - return 1; + return -1; } void cleanup_module() @@ -136,7 +136,7 @@ void cleanup_module() cc2520_interface_free(); cc2520_plat_gpio_free(); cc2520_plat_spi_free(); - INFO((KERN_INFO "Unloading CC2520 Kernel Module...\n")); + INFO((KERN_INFO "[cc2520] - Unloading kernel module\n")); } MODULE_LICENSE("GPL"); diff --git a/patches/bcm2708.patch b/patches/bcm2708.patch index 5ae2fb2..33468ed 100644 --- a/patches/bcm2708.patch +++ b/patches/bcm2708.patch @@ -1,5 +1,5 @@ diff --git a/arch/arm/mach-bcm2708/bcm2708.c b/arch/arm/mach-bcm2708/bcm2708.c -index 7fe7283..32f1fdf 100644 +index 9a5632f..6f39d36 100644 --- a/arch/arm/mach-bcm2708/bcm2708.c +++ b/arch/arm/mach-bcm2708/bcm2708.c @@ -584,6 +584,9 @@ static struct platform_device bcm2708_spi_device = { @@ -11,4 +11,4 @@ index 7fe7283..32f1fdf 100644 + }, }; - #ifdef CONFIG_SPI + #ifdef CONFIG_BCM2708_SPIDEV diff --git a/patches/spi-bcm2708.patch b/patches/spi-bcm2708.patch index 54a4d07..0fe1d79 100644 --- a/patches/spi-bcm2708.patch +++ b/patches/spi-bcm2708.patch @@ -1,5 +1,5 @@ diff --git a/drivers/spi/spi-bcm2708.c b/drivers/spi/spi-bcm2708.c -index 088cbaa..661a4cb 100644 +index 1744c1e..b648ab4 100644 --- a/drivers/spi/spi-bcm2708.c +++ b/drivers/spi/spi-bcm2708.c @@ -1,7 +1,7 @@ @@ -11,7 +11,7 @@ index 088cbaa..661a4cb 100644 * * This driver is inspired by: * spi-ath79.c, Copyright (C) 2009-2011 Gabor Juhos -@@ -35,6 +35,14 @@ +@@ -35,6 +35,15 @@ #include #include #include @@ -23,10 +23,11 @@ index 088cbaa..661a4cb 100644 +static short processmode=1; +module_param(processmode,short,0); +MODULE_PARM_DESC(processmode,"Processing mode: 0=polling, 1=interrupt driven, 2=dma"); ++ /* SPI register offsets */ #define SPI_CS 0x00 -@@ -74,6 +82,37 @@ +@@ -74,6 +83,37 @@ #define DRV_NAME "bcm2708_spi" @@ -64,7 +65,7 @@ index 088cbaa..661a4cb 100644 struct bcm2708_spi { spinlock_t lock; void __iomem *base; -@@ -81,14 +120,24 @@ struct bcm2708_spi { +@@ -81,14 +121,24 @@ struct bcm2708_spi { struct clk *clk; bool stopping; @@ -95,7 +96,7 @@ index 088cbaa..661a4cb 100644 }; struct bcm2708_spi_state { -@@ -132,75 +181,9 @@ static inline void bcm2708_wr(struct bcm2708_spi *bs, unsigned reg, u32 val) +@@ -132,96 +182,9 @@ static inline void bcm2708_wr(struct bcm2708_spi *bs, unsigned reg, u32 val) writel(val, bs->base + reg); } @@ -113,10 +114,31 @@ index 088cbaa..661a4cb 100644 -static inline void bcm2708_wr_fifo(struct bcm2708_spi *bs, int len) -{ - u8 byte; +- u16 val; - - if (len > bs->len) - len = bs->len; - +- if (unlikely(bcm2708_rd(bs, SPI_CS) & SPI_CS_LEN)) { +- /* LoSSI mode */ +- if (unlikely(len % 2)) { +- printk(KERN_ERR"bcm2708_wr_fifo: length must be even, skipping.\n"); +- bs->len = 0; +- return; +- } +- while (len) { +- if (bs->tx_buf) { +- val = *(const u16 *)bs->tx_buf; +- bs->tx_buf += 2; +- } else +- val = 0; +- bcm2708_wr(bs, SPI_FIFO, val); +- bs->len -= 2; +- len -= 2; +- } +- return; +- } +- - while (len--) { - byte = bs->tx_buf ? *bs->tx_buf++ : 0; - bcm2708_wr(bs, SPI_FIFO, byte); @@ -173,7 +195,7 @@ index 088cbaa..661a4cb 100644 { struct bcm2708_spi *bs = spi_master_get_devdata(master); int cdiv; -@@ -259,96 +242,468 @@ static int bcm2708_setup_state(struct spi_master *master, +@@ -284,97 +247,468 @@ static int bcm2708_setup_state(struct spi_master *master, if (state) { state->cs = cs; state->cdiv = cdiv; @@ -228,7 +250,8 @@ index 088cbaa..661a4cb 100644 - ret = bcm2708_setup_state(spi->master, &spi->dev, &state, - xfer->speed_hz ? xfer->speed_hz : spi->max_speed_hz, - spi->chip_select, spi->mode, -- spi->bits_per_word); +- xfer->bits_per_word ? xfer->bits_per_word : +- spi->bits_per_word); - if (ret) - return ret; +static int bcm2708_register_dmabuffer(struct platform_device *pdev, @@ -286,8 +309,7 @@ index 088cbaa..661a4cb 100644 + /* return IRQ handled */ + return IRQ_HANDLED; +} - -- cs = stp->cs | SPI_CS_INTR | SPI_CS_INTD | SPI_CS_TA; ++ +/* We could improve on DMA options, by chaining individual xfer messages + into a more complex CB chain that takes care of all the transfers in one "go" + resulting in only one interrupt getting delivered at the end of the sequence. @@ -344,7 +366,8 @@ index 088cbaa..661a4cb 100644 + } + /* auto deselect CS if it is the last */ + if (flags&FLAGS_LAST_TRANSFER) { cs|=SPI_CS_ADCS; } -+ + +- cs = stp->cs | SPI_CS_INTR | SPI_CS_INTD | SPI_CS_TA; + /* store data for interrupts and more */ + bs->rx_buf=xfer->rx_buf; + bs->tx_buf=xfer->tx_buf; @@ -461,7 +484,9 @@ index 088cbaa..661a4cb 100644 + (bs->rx_len)--; + } + spin_unlock(&bs->lock); -+ + +- if (xfer->delay_usecs) +- udelay(xfer->delay_usecs); + /* and if we have rx_len as 0 then wakeup the process */ + if (bs->rx_len==0) { + /* clean the transfers including all interrupts */ @@ -470,9 +495,7 @@ index 088cbaa..661a4cb 100644 + /* and wake up the thread to continue its work */ + complete(&bs->done); + } - -- if (xfer->delay_usecs) -- udelay(xfer->delay_usecs); ++ + /* return IRQ handled */ + return IRQ_HANDLED; +} @@ -566,7 +589,10 @@ index 088cbaa..661a4cb 100644 - spin_unlock_irqrestore(&bs->lock, flags); + /* increment type counter */ + bs->transfers_polling++; -+ + +- list_for_each_entry(xfer, &msg->transfers, transfer_list) { +- status = bcm2708_process_transfer(bs, msg, xfer); +- if (status) + /* start by setting up the SPI controller */ + cs=stp->cs|SPI_CS_TA; + bcm2708_wr(bs, SPI_CLK, stp->cdiv); @@ -597,10 +623,7 @@ index 088cbaa..661a4cb 100644 + /* and return OK */ + return 0; +} - -- list_for_each_entry(xfer, &msg->transfers, transfer_list) { -- status = bcm2708_process_transfer(bs, msg, xfer); -- if (status) ++ +/* this one sends a message */ +static int bcm2708_transfer_one_message(struct spi_master *master, + struct spi_message* msg) { @@ -701,7 +724,7 @@ index 088cbaa..661a4cb 100644 } static int bcm2708_spi_setup(struct spi_device *spi) -@@ -357,11 +712,13 @@ static int bcm2708_spi_setup(struct spi_device *spi) +@@ -383,11 +717,13 @@ static int bcm2708_spi_setup(struct spi_device *spi) struct bcm2708_spi_state *state; int ret; @@ -716,7 +739,7 @@ index 088cbaa..661a4cb 100644 dev_dbg(&spi->dev, "setup: invalid chipselect %u (%u defined)\n", spi->chip_select, spi->master->num_chipselect); -@@ -378,12 +735,11 @@ static int bcm2708_spi_setup(struct spi_device *spi) +@@ -404,12 +740,11 @@ static int bcm2708_spi_setup(struct spi_device *spi) } ret = bcm2708_setup_state(spi->master, &spi->dev, state, @@ -731,7 +754,7 @@ index 088cbaa..661a4cb 100644 } dev_dbg(&spi->dev, -@@ -394,48 +750,6 @@ static int bcm2708_spi_setup(struct spi_device *spi) +@@ -420,48 +755,6 @@ static int bcm2708_spi_setup(struct spi_device *spi) return 0; } @@ -780,7 +803,7 @@ index 088cbaa..661a4cb 100644 static void bcm2708_spi_cleanup(struct spi_device *spi) { if (spi->controller_state) { -@@ -451,6 +765,7 @@ static int __devinit bcm2708_spi_probe(struct platform_device *pdev) +@@ -477,6 +770,7 @@ static int __devinit bcm2708_spi_probe(struct platform_device *pdev) struct clk *clk; struct spi_master *master; struct bcm2708_spi *bs; @@ -788,7 +811,7 @@ index 088cbaa..661a4cb 100644 regs = platform_get_resource(pdev, IORESOURCE_MEM, 0); if (!regs) { -@@ -484,40 +799,75 @@ static int __devinit bcm2708_spi_probe(struct platform_device *pdev) +@@ -510,16 +804,25 @@ static int __devinit bcm2708_spi_probe(struct platform_device *pdev) master->bus_num = pdev->id; master->num_chipselect = 3; master->setup = bcm2708_spi_setup; @@ -802,23 +825,23 @@ index 088cbaa..661a4cb 100644 + platform_set_drvdata(pdev, master); -- bs = spi_master_get_devdata(master); - -+ bs = spi_master_get_devdata(master); + bs = spi_master_get_devdata(master); +- spin_lock_init(&bs->lock); - INIT_LIST_HEAD(&bs->queue); init_completion(&bs->done); - INIT_WORK(&bs->work, bcm2708_work); - ++ + /* set counters */ + bs->transfers_polling=0; + bs->transfers_irqdriven=0; + bs->transfers_dmadriven=0; + + /* get Register Map */ + bs->base = ioremap(regs->start, resource_size(regs)); if (!bs->base) { - dev_err(&pdev->dev, "could not remap memory\n"); +@@ -527,21 +830,46 @@ static int __devinit bcm2708_spi_probe(struct platform_device *pdev) goto out_master_put; } @@ -872,11 +895,8 @@ index 088cbaa..661a4cb 100644 + goto out_free_dma_tx; } -+ /* initialise the hardware */ - clk_enable(clk); - bcm2708_wr(bs, SPI_CS, SPI_CS_REN | SPI_CS_CLEAR_RX | SPI_CS_CLEAR_TX); -@@ -525,18 +875,35 @@ static int __devinit bcm2708_spi_probe(struct platform_device *pdev) +@@ -551,18 +879,36 @@ static int __devinit bcm2708_spi_probe(struct platform_device *pdev) err = spi_register_master(master); if (err) { dev_err(&pdev->dev, "could not register SPI master: %d\n", err); @@ -900,7 +920,7 @@ index 088cbaa..661a4cb 100644 + } + dev_info(&pdev->dev, "SPI Controller running in %s mode\n",mode); return 0; -- + +out_free_dma_irq: + free_irq(bs->dma_rx.irq, master); +out_free_dma_tx: @@ -916,7 +936,7 @@ index 088cbaa..661a4cb 100644 out_iounmap: iounmap(bs->base); out_master_put: -@@ -551,19 +918,29 @@ static int __devexit bcm2708_spi_remove(struct platform_device *pdev) +@@ -577,19 +923,29 @@ static int __devexit bcm2708_spi_remove(struct platform_device *pdev) struct spi_master *master = platform_get_drvdata(pdev); struct bcm2708_spi *bs = spi_master_get_devdata(master); @@ -950,18 +970,18 @@ index 088cbaa..661a4cb 100644 spi_unregister_master(master); return 0; -@@ -581,6 +958,10 @@ static struct platform_driver bcm2708_spi_driver = { +@@ -607,6 +963,10 @@ static struct platform_driver bcm2708_spi_driver = { static int __init bcm2708_spi_init(void) { -+ /* range check for processmode */ -+ if ((processmode<0) || (processmode>3)) { -+ processmode=1; ++ /* range check for processmode */ ++ if ((processmode<0) || (processmode>3)) { ++ processmode=1; + } return platform_driver_probe(&bcm2708_spi_driver, bcm2708_spi_probe); } module_init(bcm2708_spi_init); -@@ -591,10 +972,9 @@ static void __exit bcm2708_spi_exit(void) +@@ -617,10 +977,9 @@ static void __exit bcm2708_spi_exit(void) } module_exit(bcm2708_spi_exit);