Skip to content
GitLab
Explore
Sign in
Register
Primary navigation
Search or go to…
Project
R
reform-boundary-uboot
Manage
Activity
Members
Labels
Plan
Issues
Issue boards
Milestones
Wiki
Code
Merge requests
Repository
Branches
Commits
Tags
Repository graph
Compare revisions
Snippets
Build
Pipelines
Jobs
Pipeline schedules
Artifacts
Deploy
Releases
Package registry
Container Registry
Model registry
Operate
Environments
Terraform modules
Monitor
Incidents
Service Desk
Analyze
Value stream analytics
Contributor analytics
CI/CD analytics
Repository analytics
Model experiments
Help
Help
Support
GitLab documentation
Compare GitLab plans
Community forum
Contribute to GitLab
Provide feedback
Keyboard shortcuts
?
Snippets
Groups
Projects
Show more breadcrumbs
Jack Humbert
reform-boundary-uboot
Commits
da61f6c4
Commit
da61f6c4
authored
14 years ago
by
Wolfgang Denk
Browse files
Options
Downloads
Plain Diff
Merge branch 'sf' of
git://git.denx.de/u-boot-blackfin
parents
9de99326
0d3fe2b1
No related branches found
No related tags found
No related merge requests found
Changes
1
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
drivers/mtd/spi/spi_flash.c
+82
-44
82 additions, 44 deletions
drivers/mtd/spi/spi_flash.c
with
82 additions
and
44 deletions
drivers/mtd/spi/spi_flash.c
+
82
−
44
View file @
da61f6c4
...
...
@@ -2,6 +2,8 @@
* SPI flash interface
*
* Copyright (C) 2008 Atmel Corporation
* Copyright (C) 2010 Reinhard Meyer, EMK Elektronik
*
* Licensed under the GPL-2 or later.
*/
...
...
@@ -96,13 +98,68 @@ int spi_flash_read_common(struct spi_flash *flash, const u8 *cmd,
return
ret
;
}
/*
* The following table holds all device probe functions
*
* shift: number of continuation bytes before the ID
* idcode: the expected IDCODE or 0xff for non JEDEC devices
* probe: the function to call
*
* Non JEDEC devices should be ordered in the table such that
* the probe functions with best detection algorithms come first.
*
* Several matching entries are permitted, they will be tried
* in sequence until a probe function returns non NULL.
*
* IDCODE_CONT_LEN may be redefined if a device needs to declare a
* larger "shift" value. IDCODE_PART_LEN generally shouldn't be
* changed. This is the max number of bytes probe functions may
* examine when looking up part-specific identification info.
*
* Probe functions will be given the idcode buffer starting at their
* manu id byte (the "idcode" in the table below). In other words,
* all of the continuation bytes will be skipped (the "shift" below).
*/
#define IDCODE_CONT_LEN 0
#define IDCODE_PART_LEN 5
static
const
struct
{
const
u8
shift
;
const
u8
idcode
;
struct
spi_flash
*
(
*
probe
)
(
struct
spi_slave
*
spi
,
u8
*
idcode
);
}
flashes
[]
=
{
/* Keep it sorted by define name */
#ifdef CONFIG_SPI_FLASH_ATMEL
{
0
,
0x1f
,
spi_flash_probe_atmel
,
},
#endif
#ifdef CONFIG_SPI_FLASH_MACRONIX
{
0
,
0xc2
,
spi_flash_probe_macronix
,
},
#endif
#ifdef CONFIG_SPI_FLASH_SPANSION
{
0
,
0x01
,
spi_flash_probe_spansion
,
},
#endif
#ifdef CONFIG_SPI_FLASH_SST
{
0
,
0xbf
,
spi_flash_probe_sst
,
},
#endif
#ifdef CONFIG_SPI_FLASH_STMICRO
{
0
,
0x20
,
spi_flash_probe_stmicro
,
},
#endif
#ifdef CONFIG_SPI_FLASH_WINBOND
{
0
,
0xef
,
spi_flash_probe_winbond
,
},
#endif
/* Keep it sorted by best detection */
#ifdef CONFIG_SPI_FLASH_STMICRO
{
0
,
0xff
,
spi_flash_probe_stmicro
,
},
#endif
};
#define IDCODE_LEN (IDCODE_CONT_LEN + IDCODE_PART_LEN)
struct
spi_flash
*
spi_flash_probe
(
unsigned
int
bus
,
unsigned
int
cs
,
unsigned
int
max_hz
,
unsigned
int
spi_mode
)
{
struct
spi_slave
*
spi
;
struct
spi_flash
*
flash
;
int
ret
;
u8
idcode
[
5
]
;
struct
spi_flash
*
flash
=
NULL
;
int
ret
,
i
,
shift
;
u8
idcode
[
IDCODE_LEN
],
*
idp
;
spi
=
spi_setup_slave
(
bus
,
cs
,
max_hz
,
spi_mode
);
if
(
!
spi
)
{
...
...
@@ -117,53 +174,34 @@ struct spi_flash *spi_flash_probe(unsigned int bus, unsigned int cs,
}
/* Read the ID codes */
ret
=
spi_flash_cmd
(
spi
,
CMD_READ_ID
,
&
idcode
,
sizeof
(
idcode
));
ret
=
spi_flash_cmd
(
spi
,
CMD_READ_ID
,
idcode
,
sizeof
(
idcode
));
if
(
ret
)
goto
err_read_id
;
debug
(
"SF: Got idcode %02x %02x %02x %02x %02x
\n
"
,
idcode
[
0
],
idcode
[
1
],
idcode
[
2
],
idcode
[
3
],
idcode
[
4
]);
switch
(
idcode
[
0
])
{
#ifdef CONFIG_SPI_FLASH_SPANSION
case
0x01
:
flash
=
spi_flash_probe_spansion
(
spi
,
idcode
);
break
;
#ifdef DEBUG
printf
(
"SF: Got idcodes
\n
"
);
print_buffer
(
0
,
idcode
,
1
,
sizeof
(
idcode
),
0
);
#endif
#ifdef CONFIG_SPI_FLASH_ATMEL
case
0x1F
:
flash
=
spi_flash_probe_atmel
(
spi
,
idcode
);
break
;
#endif
#ifdef CONFIG_SPI_FLASH_MACRONIX
case
0xc2
:
flash
=
spi_flash_probe_macronix
(
spi
,
idcode
);
break
;
#endif
#ifdef CONFIG_SPI_FLASH_WINBOND
case
0xef
:
flash
=
spi_flash_probe_winbond
(
spi
,
idcode
);
break
;
#endif
#ifdef CONFIG_SPI_FLASH_STMICRO
case
0x20
:
case
0xff
:
/* Let the stmicro func handle non-JEDEC ids */
flash
=
spi_flash_probe_stmicro
(
spi
,
idcode
);
break
;
#endif
#ifdef CONFIG_SPI_FLASH_SST
case
0xBF
:
flash
=
spi_flash_probe_sst
(
spi
,
idcode
);
break
;
#endif
default:
printf
(
"SF: Unsupported manufacturer %02X
\n
"
,
idcode
[
0
]);
flash
=
NULL
;
break
;
}
if
(
!
flash
)
/* count the number of continuation bytes */
for
(
shift
=
0
,
idp
=
idcode
;
shift
<
IDCODE_CONT_LEN
&&
*
idp
==
0x7f
;
++
shift
,
++
idp
)
continue
;
/* search the table for matches in shift and id */
for
(
i
=
0
;
i
<
ARRAY_SIZE
(
flashes
);
++
i
)
if
(
flashes
[
i
].
shift
==
shift
&&
flashes
[
i
].
idcode
==
*
idp
)
{
/* we have a match, call probe */
flash
=
flashes
[
i
].
probe
(
spi
,
idp
);
if
(
flash
)
break
;
}
if
(
!
flash
)
{
printf
(
"SF: Unsupported manufacturer %02x
\n
"
,
*
idp
);
goto
err_manufacturer_probe
;
}
spi_release_bus
(
spi
);
...
...
This diff is collapsed.
Click to expand it.
Preview
0%
Loading
Try again
or
attach a new file
.
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Save comment
Cancel
Please
register
or
sign in
to comment