map.h
上传用户:lgb322
上传日期:2013-02-24
资源大小:30529k
文件大小:4k
源码类别:

嵌入式Linux

开发平台:

Unix_Linux

  1. /* Overhauled routines for dealing with different mmap regions of flash */
  2. /* $Id: map.h,v 1.27 2002/02/21 08:26:59 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. __u64 (*read64)(struct map_info *, unsigned long);  
  32. /* If it returned a 'long' I'd call it readl.
  33.  * It doesn't.
  34.  * I won't.
  35.  * dwmw2 */
  36. void (*copy_from)(struct map_info *, void *, unsigned long, ssize_t);
  37. void (*write8)(struct map_info *, __u8, unsigned long);
  38. void (*write16)(struct map_info *, __u16, unsigned long);
  39. void (*write32)(struct map_info *, __u32, unsigned long);
  40. void (*write64)(struct map_info *, __u64, unsigned long);
  41. void (*copy_to)(struct map_info *, unsigned long, const void *, ssize_t);
  42. void (*set_vpp)(struct map_info *, int);
  43. /* We put these two here rather than a single void *map_priv, 
  44.    because we want mappers to be able to have quickly-accessible
  45.    cache for the 'currently-mapped page' without the _extra_
  46.    redirection that would be necessary. If you need more than
  47.    two longs, turn the second into a pointer. dwmw2 */
  48. unsigned long map_priv_1;
  49. unsigned long map_priv_2;
  50. void *fldrv_priv;
  51. struct mtd_chip_driver *fldrv;
  52. };
  53. struct mtd_chip_driver {
  54. struct mtd_info *(*probe)(struct map_info *map);
  55. void (*destroy)(struct mtd_info *);
  56. struct module *module;
  57. char *name;
  58. struct list_head list;
  59. };
  60. void register_mtd_chip_driver(struct mtd_chip_driver *);
  61. void unregister_mtd_chip_driver(struct mtd_chip_driver *);
  62. struct mtd_info *do_map_probe(const char *name, struct map_info *map);
  63. /*
  64.  * Destroy an MTD device which was created for a map device.
  65.  * Make sure the MTD device is already unregistered before calling this
  66.  */
  67. static inline void map_destroy(struct mtd_info *mtd)
  68. {
  69. struct map_info *map = mtd->priv;
  70. if (map->fldrv->destroy)
  71. map->fldrv->destroy(mtd);
  72. #ifdef CONFIG_MODULES
  73. if (map->fldrv->module)
  74. __MOD_DEC_USE_COUNT(map->fldrv->module);
  75. #endif
  76. kfree(mtd);
  77. }
  78. #define ENABLE_VPP(map) do { if(map->set_vpp) map->set_vpp(map, 1); } while(0)
  79. #define DISABLE_VPP(map) do { if(map->set_vpp) map->set_vpp(map, 0); } while(0)
  80. extern __u8 mtd_generic_read8(struct map_info *map, unsigned long ofs);
  81. extern __u16 mtd_generic_read16(struct map_info *map, unsigned long ofs);
  82. extern __u32 mtd_generic_read32(struct map_info *map, unsigned long ofs);
  83. extern void mtd_generic_copy_from(struct map_info *map, void *to, unsigned long from, ssize_t len);
  84. extern void mtd_generic_write8(struct map_info *map, __u8 d, unsigned long adr);
  85. extern void mtd_generic_write16(struct map_info *map, __u16 d, unsigned long adr);
  86. extern void mtd_generic_write32(struct map_info *map, __u32 d, unsigned long adr);
  87. extern void mtd_generic_copy_to(struct map_info *map, unsigned long to, const void *from, ssize_t len);
  88. #endif /* __LINUX_MTD_MAP_H__ */