map.h
上传用户:jlfgdled
上传日期:2013-04-10
资源大小:33168k
文件大小:3k
源码类别:

Linux/Unix编程

开发平台:

Unix_Linux

  1. /* Overhauled routines for dealing with different mmap regions of flash */
  2. /* $Id: map.h,v 1.25 2001/09/09 15:04:17 dwmw2 Exp $ */
  3. #ifndef __LINUX_MTD_MAP_H__
  4. #define __LINUX_MTD_MAP_H__
  5. #include <linux/config.h>
  6. #include <linux/types.h>
  7. #include <linux/mtd/mtd.h>
  8. #include <linux/slab.h>
  9. /* The map stuff is very simple. You fill in your struct map_info with
  10.    a handful of routines for accessing the device, making sure they handle
  11.    paging etc. correctly if your device needs it. Then you pass it off
  12.    to a chip driver which deals with a mapped device - generally either
  13.    do_cfi_probe() or do_ram_probe(), either of which will return a 
  14.    struct mtd_info if they liked what they saw. At which point, you
  15.    fill in the mtd->module with your own module address, and register 
  16.    it.
  17.    
  18.    The mtd->priv field will point to the struct map_info, and any further
  19.    private data required by the chip driver is linked from the 
  20.    mtd->priv->fldrv_priv field. This allows the map driver to get at 
  21.    the destructor function map->fldrv_destroy() when it's tired
  22.    of living.
  23. */
  24. struct map_info {
  25. char *name;
  26. unsigned long size;
  27. int buswidth; /* in octets */
  28. __u8 (*read8)(struct map_info *, unsigned long);
  29. __u16 (*read16)(struct map_info *, unsigned long);
  30. __u32 (*read32)(struct map_info *, unsigned long);  
  31. /* If it returned a 'long' I'd call it readl.
  32.  * It doesn't.
  33.  * I won't.
  34.  * dwmw2 */
  35. void (*copy_from)(struct map_info *, void *, unsigned long, ssize_t);
  36. void (*write8)(struct map_info *, __u8, unsigned long);
  37. void (*write16)(struct map_info *, __u16, unsigned long);
  38. void (*write32)(struct map_info *, __u32, unsigned long);
  39. void (*copy_to)(struct map_info *, unsigned long, const void *, ssize_t);
  40. void (*set_vpp)(struct map_info *, int);
  41. /* We put these two here rather than a single void *map_priv, 
  42.    because we want mappers to be able to have quickly-accessible
  43.    cache for the 'currently-mapped page' without the _extra_
  44.    redirection that would be necessary. If you need more than
  45.    two longs, turn the second into a pointer. dwmw2 */
  46. unsigned long map_priv_1;
  47. unsigned long map_priv_2;
  48. void *fldrv_priv;
  49. struct mtd_chip_driver *fldrv;
  50. };
  51. struct mtd_chip_driver {
  52. struct mtd_info *(*probe)(struct map_info *map);
  53. void (*destroy)(struct mtd_info *);
  54. struct module *module;
  55. char *name;
  56. struct list_head list;
  57. };
  58. void register_mtd_chip_driver(struct mtd_chip_driver *);
  59. void unregister_mtd_chip_driver(struct mtd_chip_driver *);
  60. struct mtd_info *do_map_probe(char *name, struct map_info *map);
  61. /*
  62.  * Destroy an MTD device which was created for a map device.
  63.  * Make sure the MTD device is already unregistered before calling this
  64.  */
  65. static inline void map_destroy(struct mtd_info *mtd)
  66. {
  67. struct map_info *map = mtd->priv;
  68. if (map->fldrv->destroy)
  69. map->fldrv->destroy(mtd);
  70. #ifdef CONFIG_MODULES
  71. if (map->fldrv->module)
  72. __MOD_DEC_USE_COUNT(map->fldrv->module);
  73. #endif
  74. kfree(mtd);
  75. }
  76. #define ENABLE_VPP(map) do { if(map->set_vpp) map->set_vpp(map, 1); } while(0)
  77. #define DISABLE_VPP(map) do { if(map->set_vpp) map->set_vpp(map, 0); } while(0)
  78. #endif /* __LINUX_MTD_MAP_H__ */