This is a preparation to introduce support for the following SoC models: S5L8720 (iPod Nano 4G, iPod Touch 2G), S5L8730 (iPod Nano 5G), S5L8723 (iPod Nano 6G) and S5L8740 (iPod Nano 7G)
The whole family consists of SoCs which are similar, running ARMv6 and Thumb2 instructions, but some peripherals are located at a different address.
No functional change is to be expected so far.
Change-Id: If1f7669c49cf110ccc52c5234cc42ffd6f2b4e80
Normally, if a device uses larger physical sector size than the logical
size and supports so-called "512e" mode, we let the device deal with
partial sector reads/writes.
However, if MAX_VIRT_SECTOR_SIZE is defined, we support
partitioning/filesystems that use a larger "virtual" sector than the
logical sector. typically this matches the physical sector size of the
drive, which means that despite a small logical sector size, all I/O
is done in terms of the physical sector size.
Therefore, when MAX_VIRT_SECTOR_SIZE and MAX_PHYS_SECTOR_SIZE are
enabled (currently only ipod5g and ipod6g), prefer software-based
partial sector I/O.
Change-Id: I0815ad0a2f987b89bb2debfbf3d0ed64cdf85525
If identify device word 209 is valid, check to see if the drive report
on the alignment of LBA0 with respect to physical sector 0.
If it's not aligned, bail immediately. Supporting this properly
won't be hard, but it's not someting we want to do unless necessary.
Change-Id: I3d5bb8fad9e32fff43dfb6454393728d7c01b93b
No functional change.
We always have it turned in for ipod6g, but this makes some of the
flow/logic easier to follow.
Change-Id: I3abeace4f70afb197e819e0944e0e76f4edc4800
These are PP502x-based devices shipped with ATA drives. However,
PIO is flaky when used with the various ATA/CF<->SD adapters, so
turn it in across the board.
Change-Id: I65384d95e2e4498eb03f43ac990b01e0c6d060c5
This isn't strictly needed for FAT32, but the core file cache code
needs to be able to reference >32bit sector addresses.
Change-Id: I57838f1228c1d45f6a8c4755c5d1f9063c13b3dd
This way if there's no valid partition/filesystem we still report the
"correct" sector size out via USB.
Update the ipod5g/6g bootloaders so they do the right thing too.
Change-Id: I0d93ae7e6664f1591d8edf1c0252c586e329cd4b
Normally, we figure out the virual sector size from the filesystem info.
However, if there's no filesystem, we fall back to the hardware's
logical sector size.
Some device firmware (eg ipod5g/6g) need their partition tables set up
with larger-than-logical sector sizes; this way we can present the
"correct" sector size to maintain interoperability with the stock
firmware and make it so that the drive can still be properly partitioned
from within rockbox.
This patch adds support for DEFAULT_VIRT_SECTOR_SIZE. Nothing uses it yet.
Change-Id: Iae746a50ffc37c51abb2c9b82d3c4596f1fa7559
When enabled this allows 512n and 4Kn drives to be used with a single build.
(So far all ATA SSDs use 512 byte logical sectors)
Change-Id: I902d2318ca8abb581699c0bca68d6e3ec227d064
Only used if MAX_LOG_SECTOR_SIZE is defined
This allows a single build to seamlessly work with (eg) 512B or 4K sectors.
Change-Id: I85d2a6612afca6a1d7a3bd49c588b5745ab2b220
Basically this requires un-hardcoding SECTOR_SIZE everywhere, in
favor of using a variable containing what was reported in IDENTIFY INFO.
Note that the rest of the storage subsystem still needs to be fixed up!
Change-Id: I7f2dbd54ff2bc16b15010721e011949cbf308e12
This lets us *natively* handle varying physical sector sizes
without playing games and lying about the logical sector size.
(The original drives use 4K _physical_ sectors with 512B logical
sectors, but you have to access everything in 4K blocks...)
Achieve this by splitting the MAX_PHYS_SECTOR_SIZE code out
of the main ATA driver and re-using it.
Change-Id: I0bc615ab4562f1e3e83171a8633c74fb60c7da1f
Fuze+, native Sonys, and some of the Zens use 2K sectoring from
the partition/filesystem perspective, even though the underlying
storage used 512-byte sectoring.
Change-Id: I247d8cae2582c63ec1d4dda0fb225b1a25c8e16a
This allows a single build to support ATA drives with (eg) 512B and 4K
logical sector sizes. This is needed because ATA drives are user-
replaceable and we don't know what could get plugged in.
* Add disk_get_log_sector_size() API (no-op for non-ATA storage)
* Mostly a no-op if MAX_LOG_SECTOR_SIZE is not enabled
* Sanity-check that storage's logical sector size is not larger
than what we're built for
NOTE: Other layers (eg ATA, FAT, etc) still need to be made aware of this.
Change-Id: Id6183ef0573cb0778fa9a91302e600c3e710eebd
* Support varying-sized logical sectors in a single build, instead
of a hardcoded SECTOR_SIZE.
* Properly truncate READ CAPACITY(10) if drive has over 2^32 sectors
And fix potential alignment issues
* Properly truncate READ_FORMAT_CAPACITY if drive has over 2^32 sectors
* Support READ CAPACITY(16)
Change-Id: I744b8629131f9ede31e1a972a6700b2244f2e798
....It's specified in 16-bit words, not bytes. So multiply it by 2.
(This hasn't been a problem in practice as everything uses 512B logical
sectors so far..)
Change-Id: I0b1abd0f6184330f0b7f5c000c5ad547038f7c95
* FLUSH_EXT is used if featureflag is set and we are using LBA48
(unconditionally used for CE-ATA on ipod6g)
* FLUSH is used if featureflag is set (ATA6+) or if device claims to be ATA5+
* Rename ata_disk_can_power_off() to ata_disk_can_sleep() as that is
what it actually tests for. Only use it to gate issuing the
STANDBY IMMEDIATE command.
* Restore behavior of ata_disk_is_active() to return 1 if drive is
"spinning" or powered up.
* Allow poweroff if drive claims PM support OR we are able to issue
FLUSH/FLUSH_EXT commands.
* Added ata_flush() to explicitly trigger a flush operation, and hook it
up to storage_flush() in the device shutdown path. (Flushes were
only previously used in the storage device power management path)
* After issuing all settings, re-issue IDENTIFY_DEVICE to make sure
it reflects everything we've enabled.
* Update manual section on Flash/SSD mods.
Change-Id: I6770a54ef3a87f4c47120bcb96c944a6652f1bf4
This is just to display the frequency correctly in the debug menu and prepare
for future use of said divider
Change-Id: Ib4c80ec71b3300bdf17edf6cc590229f7640d0f5
This information is available in the RDA5802N or RDA5807 datasheet. I suspect
that register SYSCONFIG6 is not actually used by the tuner. Based on an
obscure statement in the datasheet, I guess SYSCONFIG5 is a frequency in Khz
called freq_direct that offsets the lower band frequency (56/67 MHz) but
1) it is not enabled (FREQ_MODE=0) and 2) it is not clear if this offset is
really just to avoid interference (ie the RF and IF are simply shifted by this
amount) or an actual offset.
Change-Id: Ia469f5370aee7c8c3390324d0cef1193c64df755
The current code relies on the initial value of some RDS register(which is
documented) but this assumption will be broken when we start enabling RDS.
This commit changes the code to really read the chip ID, although it is more
involved.
Change-Id: I0ed630322a94523612d2f0297dbcbea5f869eb6d
ipod6g was configured with SECTOR_SIZE of 4096, but this ATA driver
unconditionally translated these to 512B operations on the actual
storage device.
Rockbox's storage layer already has robust support for "logical sectors
larger than physical storage sectors" through use of
MAX_LOG_SECTOR_SIZE. So switch to that mechanism, allowing the ipod6g
ATA driver to be simplified.
If we want to support drives with physical sector sizes > 512B, then
we need to port the MAX_PHYS_SECTOR_SIZE logic from the primary ATA driver.
Additional changes:
* Simplify MWDMA/UDMA selection logic
* Report CE-ATA mode in debug menu
* Use LBA48 commands only if drive is over 128GiB.
* Drop default sleep/poweroff time from 20s to 7s (matching main ATA driver)
Finally, the bulk of the changes are the first phase of a badly needed
style cleanup that made reading this driver a lot harder than it should
be. I intend to split this into a separate patch.
Change-Id: I2feca9fd319c8d6cfb3c2610208970428d2fa947
I'm 98% sure that the "byteswapped" value I saw was due to another bug
(bad PIO timings on ipods leading to data corruption) and none of the
growing pile of identify device data files that I have include the
backwards one.
Change-Id: Iea47b7419b120a3c8a282b2e3a8f65b8965356ce
The iPod 4g and color always ignored the very first
button press after booting, i.e. you needed to either
press another button or scroll for a bit first.
Not sure whether any other PP iPods exhibit the same
behavior, although it is not reproducible on an iPod
video.
This patch basically copies the code from FS#5230
that fixed unresponsive buttons whenever the HOLD
switch was turned off (committed as a5961c944b).
Change-Id: I8d3444094e5d000e0f8e30e39a23f054abeeb0f5
Basically, there are weak aliases for all possible IRQ handlers,
pointing at a NORETURN function. GCC complains that the aliases
don't have the same attribute, but that's actually what we want.
Change-Id: I7f877e00193ed457589c8442db82e93ddea0d60a