linux/Documentation/fmc/fmc-chardev.txt
<<
>>
Prefs
   1fmc-chardev
   2===========
   3
   4This is a simple generic driver, that allows user access by means of a
   5character device (actually, one for each mezzanine it takes hold of).
   6
   7The char device is created as a misc device. Its name in /dev (as
   8created by udev) is the same name as the underlying FMC device. Thus,
   9the name can be a silly fmc-0000 look-alike if the device has no
  10identifiers nor bus_id, a more specific fmc-0400 if the device has a
  11bus-specific address but no associated name, or something like
  12fdelay-0400 if the FMC core can rely on both a mezzanine name and a bus
  13address.
  14
  15Currently the driver only supports read and write: you can lseek to the
  16desired address and read or write a register.
  17
  18The driver assumes all registers are 32-bit in size, and only accepts a
  19single read or write per system call. However, as a result of Unix read
  20and write semantics, users can simply fread or fwrite bigger areas in
  21order to dump or store bigger memory areas.
  22
  23There is currently no support for mmap, user-space interrupt management
  24and DMA buffers. They may be added in later versions, if the need
  25arises.
  26
  27The example below shows raw access to a SPEC card programmed with its
  28golden FPGA file, that features an SDB structure at offset 256 - i.e.
  2964 words.  The mezzanine's EEPROM in this case is not programmed, so the
  30default name is fmc-<bus><devfn>, and there are two cards in the system:
  31
  32  spusa.root# insmod fmc-chardev.ko
  33  [ 1073.339332] spec 0000:02:00.0: Driver has no ID: matches all
  34  [ 1073.345051] spec 0000:02:00.0: Created misc device "fmc-0200"
  35  [ 1073.350821] spec 0000:04:00.0: Driver has no ID: matches all
  36  [ 1073.356525] spec 0000:04:00.0: Created misc device "fmc-0400"
  37  spusa.root# ls -l /dev/fmc*
  38  crw------- 1 root root 10, 58 Nov 20 19:23 /dev/fmc-0200
  39  crw------- 1 root root 10, 57 Nov 20 19:23 /dev/fmc-0400
  40  spusa.root# dd bs=4 skip=64 count=1 if=/dev/fmc-0200 2> /dev/null | od -t x1z
  41  0000000 2d 42 44 53                                      >-BDS<
  42  0000004
  43
  44The simple program tools/fmc-mem in this package can access an FMC char
  45device and read or write a word or a whole area.  Actually, the program
  46is not specific to FMC at all, it just uses lseek, read and write.
  47
  48Its first argument is the device name, the second the offset, the third
  49(if any) the value to write and the optional last argument that must
  50begin with "+" is the number of bytes to read or write.  In case of
  51repeated reading data is written to stdout; repeated writes read from
  52stdin and the value argument is ignored.
  53
  54The following examples show reading the SDB magic number and the first
  55SDB record from a SPEC device programmed with its golden image:
  56
  57     spusa.root# ./fmc-mem /dev/fmc-0200 100
  58     5344422d
  59     spusa.root# ./fmc-mem /dev/fmc-0200 100 +40 | od -Ax -t x1z
  60     000000 2d 42 44 53 00 01 02 00 00 00 00 00 00 00 00 00  >-BDS............<
  61     000010 00 00 00 00 ff 01 00 00 00 00 00 00 51 06 00 00  >............Q...<
  62     000020 c9 42 a5 e6 02 00 00 00 11 05 12 20 2d 34 42 57  >.B......... -4BW<
  63     000030 73 6f 72 43 72 61 62 73 49 53 47 2d 00 20 20 20  >sorCrabsISG-.   <
  64     000040
  65
lxr.linux.no kindly hosted by Redpill Linpro AS, provider of Linux consulting and operations services since 1995.