Alessandro Rubini | 4debfe4 | 2013-06-18 23:48:07 +0200 | [diff] [blame] | 1 | fmc-chardev |
| 2 | =========== |
| 3 | |
| 4 | This is a simple generic driver, that allows user access by means of a |
| 5 | character device (actually, one for each mezzanine it takes hold of). |
| 6 | |
| 7 | The char device is created as a misc device. Its name in /dev (as |
| 8 | created by udev) is the same name as the underlying FMC device. Thus, |
| 9 | the name can be a silly fmc-0000 look-alike if the device has no |
| 10 | identifiers nor bus_id, a more specific fmc-0400 if the device has a |
| 11 | bus-specific address but no associated name, or something like |
| 12 | fdelay-0400 if the FMC core can rely on both a mezzanine name and a bus |
| 13 | address. |
| 14 | |
| 15 | Currently the driver only supports read and write: you can lseek to the |
| 16 | desired address and read or write a register. |
| 17 | |
| 18 | The driver assumes all registers are 32-bit in size, and only accepts a |
| 19 | single read or write per system call. However, as a result of Unix read |
| 20 | and write semantics, users can simply fread or fwrite bigger areas in |
| 21 | order to dump or store bigger memory areas. |
| 22 | |
| 23 | There is currently no support for mmap, user-space interrupt management |
| 24 | and DMA buffers. They may be added in later versions, if the need |
| 25 | arises. |
| 26 | |
| 27 | The example below shows raw access to a SPEC card programmed with its |
| 28 | golden FPGA file, that features an SDB structure at offset 256 - i.e. |
| 29 | 64 words. The mezzanine's EEPROM in this case is not programmed, so the |
| 30 | default 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 | |
| 44 | The simple program tools/fmc-mem in this package can access an FMC char |
| 45 | device and read or write a word or a whole area. Actually, the program |
| 46 | is not specific to FMC at all, it just uses lseek, read and write. |
| 47 | |
| 48 | Its 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 |
| 50 | begin with "+" is the number of bytes to read or write. In case of |
| 51 | repeated reading data is written to stdout; repeated writes read from |
| 52 | stdin and the value argument is ignored. |
| 53 | |
| 54 | The following examples show reading the SDB magic number and the first |
| 55 | SDB 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 |