mirror of
https://github.com/AuxXxilium/linux_dsm_epyc7002.git
synced 2024-11-24 10:40:53 +07:00
[PATCH] SPI: spi_butterfly, restore lost deltas
This resolves some minor version skew glitches that accumulated for the AVR Butterfly adapter driver, which caused among other things the existence of a duplicate Kconfig entry. Most of it boils down to comment updates, but in one case it removes some now-superfluous code that would be better if not copied into other controller-level drivers. Signed-off-by: David Brownell <dbrownell@users.sourceforge.net>
This commit is contained in:
parent
022f7b07bf
commit
9c1da3cb46
@ -12,13 +12,20 @@ You can make this adapter from an old printer cable and solder things
|
|||||||
directly to the Butterfly. Or (if you have the parts and skills) you
|
directly to the Butterfly. Or (if you have the parts and skills) you
|
||||||
can come up with something fancier, providing ciruit protection to the
|
can come up with something fancier, providing ciruit protection to the
|
||||||
Butterfly and the printer port, or with a better power supply than two
|
Butterfly and the printer port, or with a better power supply than two
|
||||||
signal pins from the printer port.
|
signal pins from the printer port. Or for that matter, you can use
|
||||||
|
similar cables to talk to many AVR boards, even a breadboard.
|
||||||
|
|
||||||
|
This is more powerful than "ISP programming" cables since it lets kernel
|
||||||
|
SPI protocol drivers interact with the AVR, and could even let the AVR
|
||||||
|
issue interrupts to them. Later, your protocol driver should work
|
||||||
|
easily with a "real SPI controller", instead of this bitbanger.
|
||||||
|
|
||||||
|
|
||||||
The first cable connections will hook Linux up to one SPI bus, with the
|
The first cable connections will hook Linux up to one SPI bus, with the
|
||||||
AVR and a DataFlash chip; and to the AVR reset line. This is all you
|
AVR and a DataFlash chip; and to the AVR reset line. This is all you
|
||||||
need to reflash the firmware, and the pins are the standard Atmel "ISP"
|
need to reflash the firmware, and the pins are the standard Atmel "ISP"
|
||||||
connector pins (used also on non-Butterfly AVR boards).
|
connector pins (used also on non-Butterfly AVR boards). On the parport
|
||||||
|
side this is like "sp12" programming cables.
|
||||||
|
|
||||||
Signal Butterfly Parport (DB-25)
|
Signal Butterfly Parport (DB-25)
|
||||||
------ --------- ---------------
|
------ --------- ---------------
|
||||||
@ -40,10 +47,14 @@ by clearing PORTB.[0-3]); (b) configure the mtd_dataflash driver; and
|
|||||||
SELECT = J400.PB0/nSS = pin 17/C3,nSELECT
|
SELECT = J400.PB0/nSS = pin 17/C3,nSELECT
|
||||||
GND = J400.GND = pin 24/GND
|
GND = J400.GND = pin 24/GND
|
||||||
|
|
||||||
The "USI" controller, using J405, can be used for a second SPI bus. That
|
Or you could flash firmware making the AVR into an SPI slave (keeping the
|
||||||
would let you talk to the AVR over SPI, running firmware that makes it act
|
DataFlash in reset) and tweak the spi_butterfly driver to make it bind to
|
||||||
as an SPI slave, while letting either Linux or the AVR use the DataFlash.
|
the driver for your custom SPI-based protocol.
|
||||||
There are plenty of spare parport pins to wire this one up, such as:
|
|
||||||
|
The "USI" controller, using J405, can also be used for a second SPI bus.
|
||||||
|
That would let you talk to the AVR using custom SPI-with-USI firmware,
|
||||||
|
while letting either Linux or the AVR use the DataFlash. There are plenty
|
||||||
|
of spare parport pins to wire this one up, such as:
|
||||||
|
|
||||||
Signal Butterfly Parport (DB-25)
|
Signal Butterfly Parport (DB-25)
|
||||||
------ --------- ---------------
|
------ --------- ---------------
|
||||||
|
@ -75,16 +75,6 @@ config SPI_BUTTERFLY
|
|||||||
inexpensive battery powered microcontroller evaluation board.
|
inexpensive battery powered microcontroller evaluation board.
|
||||||
This same cable can be used to flash new firmware.
|
This same cable can be used to flash new firmware.
|
||||||
|
|
||||||
config SPI_BUTTERFLY
|
|
||||||
tristate "Parallel port adapter for AVR Butterfly (DEVELOPMENT)"
|
|
||||||
depends on SPI_MASTER && PARPORT && EXPERIMENTAL
|
|
||||||
select SPI_BITBANG
|
|
||||||
help
|
|
||||||
This uses a custom parallel port cable to connect to an AVR
|
|
||||||
Butterfly <http://www.atmel.com/products/avr/butterfly>, an
|
|
||||||
inexpensive battery powered microcontroller evaluation board.
|
|
||||||
This same cable can be used to flash new firmware.
|
|
||||||
|
|
||||||
#
|
#
|
||||||
# Add new SPI master controllers in alphabetical order above this line
|
# Add new SPI master controllers in alphabetical order above this line
|
||||||
#
|
#
|
||||||
|
@ -163,21 +163,20 @@ static void butterfly_chipselect(struct spi_device *spi, int value)
|
|||||||
struct butterfly *pp = spidev_to_pp(spi);
|
struct butterfly *pp = spidev_to_pp(spi);
|
||||||
|
|
||||||
/* set default clock polarity */
|
/* set default clock polarity */
|
||||||
if (value)
|
if (value != BITBANG_CS_INACTIVE)
|
||||||
setsck(spi, spi->mode & SPI_CPOL);
|
setsck(spi, spi->mode & SPI_CPOL);
|
||||||
|
|
||||||
/* no chipselect on this USI link config */
|
/* no chipselect on this USI link config */
|
||||||
if (is_usidev(spi))
|
if (is_usidev(spi))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
/* here, value == "activate or not" */
|
/* here, value == "activate or not";
|
||||||
|
* most PARPORT_CONTROL_* bits are negated, so we must
|
||||||
/* most PARPORT_CONTROL_* bits are negated */
|
* morph it to value == "bit value to write in control register"
|
||||||
|
*/
|
||||||
if (spi_cs_bit == PARPORT_CONTROL_INIT)
|
if (spi_cs_bit == PARPORT_CONTROL_INIT)
|
||||||
value = !value;
|
value = !value;
|
||||||
|
|
||||||
/* here, value == "bit value to write in control register" */
|
|
||||||
|
|
||||||
parport_frob_control(pp->port, spi_cs_bit, value ? spi_cs_bit : 0);
|
parport_frob_control(pp->port, spi_cs_bit, value ? spi_cs_bit : 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -202,7 +201,9 @@ butterfly_txrx_word_mode0(struct spi_device *spi,
|
|||||||
|
|
||||||
/* override default partitioning with cmdlinepart */
|
/* override default partitioning with cmdlinepart */
|
||||||
static struct mtd_partition partitions[] = { {
|
static struct mtd_partition partitions[] = { {
|
||||||
/* JFFS2 wants partitions of 4*N blocks for this device ... */
|
/* JFFS2 wants partitions of 4*N blocks for this device,
|
||||||
|
* so sectors 0 and 1 can't be partitions by themselves.
|
||||||
|
*/
|
||||||
|
|
||||||
/* sector 0 = 8 pages * 264 bytes/page (1 block)
|
/* sector 0 = 8 pages * 264 bytes/page (1 block)
|
||||||
* sector 1 = 248 pages * 264 bytes/page
|
* sector 1 = 248 pages * 264 bytes/page
|
||||||
@ -316,8 +317,9 @@ static void butterfly_attach(struct parport *p)
|
|||||||
if (status < 0)
|
if (status < 0)
|
||||||
goto clean2;
|
goto clean2;
|
||||||
|
|
||||||
/* Bus 1 lets us talk to at45db041b (firmware disables AVR)
|
/* Bus 1 lets us talk to at45db041b (firmware disables AVR SPI), AVR
|
||||||
* or AVR (firmware resets at45, acts as spi slave)
|
* (firmware resets at45, acts as spi slave) or neither (we ignore
|
||||||
|
* both, AVR uses AT45). Here we expect firmware for the first option.
|
||||||
*/
|
*/
|
||||||
pp->info[0].max_speed_hz = 15 * 1000 * 1000;
|
pp->info[0].max_speed_hz = 15 * 1000 * 1000;
|
||||||
strcpy(pp->info[0].modalias, "mtd_dataflash");
|
strcpy(pp->info[0].modalias, "mtd_dataflash");
|
||||||
@ -330,7 +332,9 @@ static void butterfly_attach(struct parport *p)
|
|||||||
pp->dataflash->dev.bus_id);
|
pp->dataflash->dev.bus_id);
|
||||||
|
|
||||||
#ifdef HAVE_USI
|
#ifdef HAVE_USI
|
||||||
/* even more custom AVR firmware */
|
/* Bus 2 is only for talking to the AVR, and it can work no
|
||||||
|
* matter who masters bus 1; needs appropriate AVR firmware.
|
||||||
|
*/
|
||||||
pp->info[1].max_speed_hz = 10 /* ?? */ * 1000 * 1000;
|
pp->info[1].max_speed_hz = 10 /* ?? */ * 1000 * 1000;
|
||||||
strcpy(pp->info[1].modalias, "butterfly");
|
strcpy(pp->info[1].modalias, "butterfly");
|
||||||
// pp->info[1].platform_data = ... TBD ... ;
|
// pp->info[1].platform_data = ... TBD ... ;
|
||||||
@ -378,13 +382,8 @@ static void butterfly_detach(struct parport *p)
|
|||||||
pp = butterfly;
|
pp = butterfly;
|
||||||
butterfly = NULL;
|
butterfly = NULL;
|
||||||
|
|
||||||
#ifdef HAVE_USI
|
/* stop() unregisters child devices too */
|
||||||
spi_unregister_device(pp->butterfly);
|
pdev = to_platform_device(pp->bitbang.master->cdev.dev);
|
||||||
pp->butterfly = NULL;
|
|
||||||
#endif
|
|
||||||
spi_unregister_device(pp->dataflash);
|
|
||||||
pp->dataflash = NULL;
|
|
||||||
|
|
||||||
status = spi_bitbang_stop(&pp->bitbang);
|
status = spi_bitbang_stop(&pp->bitbang);
|
||||||
|
|
||||||
/* turn off VCC */
|
/* turn off VCC */
|
||||||
@ -394,8 +393,6 @@ static void butterfly_detach(struct parport *p)
|
|||||||
parport_release(pp->pd);
|
parport_release(pp->pd);
|
||||||
parport_unregister_device(pp->pd);
|
parport_unregister_device(pp->pd);
|
||||||
|
|
||||||
pdev = to_platform_device(pp->bitbang.master->cdev.dev);
|
|
||||||
|
|
||||||
(void) spi_master_put(pp->bitbang.master);
|
(void) spi_master_put(pp->bitbang.master);
|
||||||
|
|
||||||
platform_device_unregister(pdev);
|
platform_device_unregister(pdev);
|
||||||
@ -420,4 +417,5 @@ static void __exit butterfly_exit(void)
|
|||||||
}
|
}
|
||||||
module_exit(butterfly_exit);
|
module_exit(butterfly_exit);
|
||||||
|
|
||||||
|
MODULE_DESCRIPTION("Parport Adapter driver for AVR Butterfly");
|
||||||
MODULE_LICENSE("GPL");
|
MODULE_LICENSE("GPL");
|
||||||
|
Loading…
Reference in New Issue
Block a user