glenda.party
term% ls -F
term% pwd
$home/manuals/9front/3/flash
term% cat index.txt
FLASH(3)                   Library Functions Manual                   FLASH(3)

NAME
       flash - flash memory

SYNOPSYS
       bind -a #F[n] /dev
       /dev/flash
       /dev/flash/part
       /dev/flash/partctl

DESCRIPTION
       The  flash memory device serves a two-level directory, giving access to
       files representing part or all of a bank of flash memory.   A  platform
       might  have more than one bank of flash, numbered starting from 0.  The
       attach specifier n is a decimal integer that selects a particular  bank
       of flash (default: 0).  Both NOR and NAND flash is supported.  For both
       types  of  flash,  the driver gives a read/write/erase interface to the
       raw flash device, which can impose  constraints  on  operations  beyond
       those  imposed by the driver.  Other drivers such as ftl(3) or logfs(3)
       implement any higher-level format  required,  including  ECC  for  NAND
       flash, for instance.

       The  top  level  directory  contains a single directory named flash for
       bank 0, and flashn for each other bank n.  It contains  two  files  for
       each  partition:  a  data  file  part  and  an  associated control file
       partctl, where part is the name of the partition.  Each partition  rep‐
       resents  a  region of flash memory that starts and ends on a flash seg‐
       ment (erase unit) boundary.  The  system  initially  creates  a  single
       standard  partition  flash  representing the whole of flash memory, and
       the corresponding control file flashctl.  Other partitions can be  cre‐
       ated by writing to flashctl as described below.

       The  data  file part provides read and write access to the bytes on the
       system's flash memory.  Bytes can be  read  and  written  on  any  byte
       boundary:  the  interface hides any alignment restrictions.  A read re‐
       turns the value of the bytes at the current file offset, where zero  is
       the  start of the partition.  A write reprograms the flash to the given
       byte values, at the current file offset (relative to the start  of  the
       partition),  using  the  physical device's reprogramming algorithm.  An
       erased flash byte is logically 0xFF (regardless of the  conventions  of
       the physical flash device).  A write can change a bit with value 1 to a
       0, but cannot change a 0 bit to 1; that can only be done by erasing one
       or  more  flash segments.  NAND flash typically has restrictions on the
       number of writes allowed to a page before requiring a block erase.

       The control file partctl can be read and written.  A read returns  sev‐
       eral  lines  containing  decimal  and hexadecimal numbers (separated by
       white space) revealing the characteristics of memory within the  parti‐
       tion.   The first line gives the manufacturer ID,  the flash device ID,
       the memory width in bytes, and a string giving  the  flash  type  (cur‐
       rently  either  nor or nand).  Subsequent lines give characteristics of
       each group of erase units within the partition, where the  erase  units
       within a group have the same properties.  Each line gives the start and
       end  (as  byte  addresses)  of  the  erase units in the region that lie
       within the partition, followed by the size in bytes of each erase unit,
       which is followed for NAND flash by the size in bytes of a  page.   The
       sizes for NAND flash include the extra bytes per page typically used to
       hold  an  ECC  and block status.  A write contains one of the following
       textual commands:

       add name start end
              Create a new partition that ranges from start to end within  the
              current  partition.   Each value must be numeric (decimal, octal
              or hexadecimal) and a multiple of the  erase  unit  size.   Name
              must  not be the name of an existing partition.  On success, new
              files name and namectl will appear in the  parent  flash  direc‐
              tory.

       erase all
              Erase  the whole flash partition, setting all bytes to 0xFF, ex‐
              cept those that are hardware write-protected.

       erase offset
              Erase the segment that begins at the  given  offset  within  the
              partition,  setting  all  bytes  to  0xFF, except those that are
              hardware write-protected.  The offset is  given  in  bytes,  but
              must be a multiple of the segment (erase unit) size.

       protectboot [ off ]
              By  default  the  system prevents erase unit 0 of the flash from
              being erased or written, assuming it contains the primary  boot‐
              strap.   Writing  this  command  with parameter off removes that
              protection.  Writing protectboot with any  other  parameter  (or
              none)  restores  the protection.  Note that a manufacturer might
              also have locked the flash in hardware, and that protection must
              be removed in a device-dependent way.

       sync   If the underlying device must buffer or cache  (current  devices
              do not), flush the buffer(s).

       The  syntax of all numbers is that of strtoul (in atof(2)); the default
       base is 10.

SOURCE
       /sys/src/*/devflash.c
       /sys/src/*/flash*.c

SEE ALSO
       flashfs(4), paqfs(4)

DIAGNOSTICS
       A write will return an error if an attempt is made to change a 0 bit to
       1, or if the flash memory fails to be programmed correctly.

BUGS
       The flash cannot be written if the kernel is  executing  directly  from
       flash,  because  the  physical flash cannot be read during programming,
       and the driver does not copy the programming code to DRAM.

                                                                      FLASH(3)