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

Linux/Unix编程

开发平台:

Unix_Linux

  1. /*
  2.  * $Id: mbx860.c,v 1.1 2001/11/18 19:43:09 dwmw2 Exp $
  3.  *
  4.  * Handle mapping of the flash on MBX860 boards
  5.  *
  6.  * Author: Anton Todorov
  7.  * Copyright: (C) 2001 Emness Technology
  8.  * 
  9.  * This program is free software; you can redistribute it and/or modify
  10.  * it under the terms of the GNU General Public License version 2 as
  11.  * published by the Free Software Foundation.
  12.  *
  13.  */
  14. #include <linux/module.h>
  15. #include <linux/types.h>
  16. #include <linux/kernel.h>
  17. #include <asm/io.h>
  18. #include <linux/mtd/mtd.h>
  19. #include <linux/mtd/map.h>
  20. #include <linux/mtd/partitions.h>
  21. #define WINDOW_ADDR 0xfe000000
  22. #define WINDOW_SIZE 0x00200000
  23. /* Flash / Partition sizing */
  24. #define MAX_SIZE_KiB              8192
  25. #define BOOT_PARTITION_SIZE_KiB    512
  26. #define KERNEL_PARTITION_SIZE_KiB 5632
  27. #define APP_PARTITION_SIZE_KiB    2048
  28. #define NUM_PARTITIONS 3
  29. /* partition_info gives details on the logical partitions that the split the
  30.  * single flash device into. If the size if zero we use up to the end of the
  31.  * device. */
  32. static struct mtd_partition partition_info[]={
  33. { name: "MBX flash BOOT partition",
  34. offset: 0,
  35. size:   BOOT_PARTITION_SIZE_KiB*1024 },
  36. { name: "MBX flash DATA partition",
  37. offset: BOOT_PARTITION_SIZE_KiB*1024,
  38. size: (KERNEL_PARTITION_SIZE_KiB)*1024 },
  39. { name: "MBX flash APPLICATION partition",
  40. offset: (BOOT_PARTITION_SIZE_KiB+KERNEL_PARTITION_SIZE_KiB)*1024 }
  41. };
  42.    
  43. static struct mtd_info *mymtd;
  44. __u8 mbx_read8(struct map_info *map, unsigned long ofs)
  45. {
  46. return readb(map->map_priv_1 + ofs);
  47. }
  48. __u16 mbx_read16(struct map_info *map, unsigned long ofs)
  49. {
  50. return readw(map->map_priv_1 + ofs);
  51. }
  52. __u32 mbx_read32(struct map_info *map, unsigned long ofs)
  53. {
  54. return readl(map->map_priv_1 + ofs);
  55. }
  56. void mbx_copy_from(struct map_info *map, void *to, unsigned long from, ssize_t len)
  57. {
  58. memcpy_fromio(to, (void *)(map->map_priv_1 + from), len);
  59. }
  60. void mbx_write8(struct map_info *map, __u8 d, unsigned long adr)
  61. {
  62. writeb(d, map->map_priv_1 + adr);
  63. }
  64. void mbx_write16(struct map_info *map, __u16 d, unsigned long adr)
  65. {
  66. writew(d, map->map_priv_1 + adr);
  67. }
  68. void mbx_write32(struct map_info *map, __u32 d, unsigned long adr)
  69. {
  70. writel(d, map->map_priv_1 + adr);
  71. }
  72. void mbx_copy_to(struct map_info *map, unsigned long to, const void *from, ssize_t len)
  73. {
  74. memcpy_toio((void *)(map->map_priv_1 + to), from, len);
  75. }
  76. struct map_info mbx_map = {
  77. name: "MBX flash",
  78. size: WINDOW_SIZE,
  79. buswidth: 4,
  80. read8: mbx_read8,
  81. read16: mbx_read16,
  82. read32: mbx_read32,
  83. copy_from: mbx_copy_from,
  84. write8: mbx_write8,
  85. write16: mbx_write16,
  86. write32: mbx_write32,
  87. copy_to: mbx_copy_to
  88. };
  89. int __init init_mbx(void)
  90. {
  91. printk(KERN_NOTICE "Motorola MBX flash device: %x at %xn", WINDOW_SIZE*4, WINDOW_ADDR);
  92. mbx_map.map_priv_1 = (unsigned long)ioremap(WINDOW_ADDR, WINDOW_SIZE * 4);
  93. if (!mbx_map.map_priv_1) {
  94. printk("Failed to ioremapn");
  95. return -EIO;
  96. }
  97. mymtd = do_map_probe("jedec_probe", &mbx_map);
  98. if (mymtd) {
  99. mymtd->module = THIS_MODULE;
  100. add_mtd_device(mymtd);
  101.                 add_mtd_partitions(mymtd, partition_info, NUM_PARTITIONS);
  102. return 0;
  103. }
  104. iounmap((void *)mbx_map.map_priv_1);
  105. return -ENXIO;
  106. }
  107. static void __exit cleanup_mbx(void)
  108. {
  109. if (mymtd) {
  110. del_mtd_device(mymtd);
  111. map_destroy(mymtd);
  112. }
  113. if (mbx_map.map_priv_1) {
  114. iounmap((void *)mbx_map.map_priv_1);
  115. mbx_map.map_priv_1 = 0;
  116. }
  117. }
  118. module_init(init_mbx);
  119. module_exit(cleanup_mbx);
  120. MODULE_AUTHOR("Anton Todorov <a.todorov@emness.com>");
  121. MODULE_DESCRIPTION("MTD map driver for Motorola MBX860 board");
  122. MODULE_LICENSE("GPL");