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

Linux/Unix编程

开发平台:

Unix_Linux

  1. /* netsc520.c -- MTD map driver for AMD NetSc520 Demonstration Board
  2.  *
  3.  * Copyright (C) 2001 Mark Langsdorf (mark.langsdorf@amd.com)
  4.  * based on sc520cdp.c by Sysgo Real-Time Solutions GmbH
  5.  *
  6.  * $Id: netsc520.c,v 1.5 2001/10/02 15:05:14 dwmw2 Exp $
  7.  *
  8.  * This program is free software; you can redistribute it and/or modify
  9.  * it under the terms of the GNU General Public License as published by
  10.  * the Free Software Foundation; either version 2 of the License, or
  11.  * (at your option) any later version.
  12.  *
  13.  * This program is distributed in the hope that it will be useful,
  14.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  15.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  16.  * GNU General Public License for more details.
  17.  *
  18.  * You should have received a copy of the GNU General Public License
  19.  * along with this program; if not, write to the Free Software
  20.  * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
  21.  *
  22.  * The NetSc520 is a demonstration board for the Elan Sc520 processor available
  23.  * from AMD.  It has a single back of 16 megs of 32-bit Flash ROM and another
  24.  * 16 megs of SDRAM.
  25.  */
  26. #include <linux/module.h>
  27. #include <linux/types.h>
  28. #include <linux/kernel.h>
  29. #include <asm/io.h>
  30. #include <linux/mtd/mtd.h>
  31. #include <linux/mtd/map.h>
  32. #include <linux/mtd/partitions.h>
  33. /*
  34. ** The single, 16 megabyte flash bank is divided into four virtual
  35. ** partitions.  The first partition is 768 KiB and is intended to
  36. ** store the kernel image loaded by the bootstrap loader.  The second
  37. ** partition is 256 KiB and holds the BIOS image.  The third 
  38. ** partition is 14.5 MiB and is intended for the flash file system
  39. ** image.  The last partition is 512 KiB and contains another copy
  40. ** of the BIOS image and the reset vector.
  41. **
  42. ** Only the third partition should be mounted.  The first partition
  43. ** should not be mounted, but it can erased and written to using the
  44. ** MTD character routines.  The second and fourth partitions should
  45. ** not be touched - it is possible to corrupt the BIOS image by
  46. ** mounting these partitions, and potentially the board will not be
  47. ** recoverable afterwards.
  48. */
  49. static __u8 netsc520_read8(struct map_info *map, unsigned long ofs)
  50. {
  51. return readb(map->map_priv_1 + ofs);
  52. }
  53. static __u16 netsc520_read16(struct map_info *map, unsigned long ofs)
  54. {
  55. return readw(map->map_priv_1 + ofs);
  56. }
  57. static __u32 netsc520_read32(struct map_info *map, unsigned long ofs)
  58. {
  59. return readl(map->map_priv_1 + ofs);
  60. }
  61. static void netsc520_copy_from(struct map_info *map, void *to, unsigned long from, ssize_t len)
  62. {
  63. memcpy_fromio(to, (void *)(map->map_priv_1 + from), len);
  64. }
  65. static void netsc520_write8(struct map_info *map, __u8 d, unsigned long adr)
  66. {
  67. writeb(d, map->map_priv_1 + adr);
  68. }
  69. static void netsc520_write16(struct map_info *map, __u16 d, unsigned long adr)
  70. {
  71. writew(d, map->map_priv_1 + adr);
  72. }
  73. static void netsc520_write32(struct map_info *map, __u32 d, unsigned long adr)
  74. {
  75. writel(d, map->map_priv_1 + adr);
  76. }
  77. static void netsc520_copy_to(struct map_info *map, unsigned long to, const void *from, ssize_t len)
  78. {
  79. memcpy_toio((void *)(map->map_priv_1 + to), from, len);
  80. }
  81. /* partition_info gives details on the logical partitions that the split the 
  82.  * single flash device into. If the size if zero we use up to the end of the
  83.  * device. */
  84. static struct mtd_partition partition_info[]={
  85.     { 
  86.     name: "NetSc520 boot kernel", 
  87.     offset: 0, 
  88.     size:  0xc0000
  89.     },
  90.     { 
  91.     name: "NetSc520 Low BIOS", 
  92.     offset: 0xc0000, 
  93.     size:  0x40000
  94.     },
  95.     { 
  96.     name: "NetSc520 file system", 
  97.     offset: 0x100000, 
  98.     size:  0xe80000
  99.     },
  100.     { 
  101.     name: "NetSc520 High BIOS", 
  102.     offset: 0xf80000, 
  103.     size: 0x80000
  104.     },
  105. };
  106. #define NUM_PARTITIONS (sizeof(partition_info)/sizeof(partition_info[0]))
  107. /*
  108.  * If no idea what is going on here.  This is taken from the FlashFX stuff.
  109.  */
  110. #define ROMCS 1
  111. #define WINDOW_SIZE 0x00100000
  112. #define WINDOW_ADDR 0x00200000
  113. static struct map_info netsc520_map = {
  114. name: "netsc520 Flash Bank",
  115. size: WINDOW_SIZE,
  116. buswidth: 4,
  117. read8: netsc520_read8,
  118. read16: netsc520_read16,
  119. read32: netsc520_read32,
  120. copy_from: netsc520_copy_from,
  121. write8: netsc520_write8,
  122. write16: netsc520_write16,
  123. write32: netsc520_write32,
  124. copy_to: netsc520_copy_to,
  125. map_priv_2: WINDOW_ADDR
  126. };
  127. #define NUM_FLASH_BANKS (sizeof(netsc520_map)/sizeof(struct map_info))
  128. static struct mtd_info *mymtd;
  129. static int __init init_netsc520(void)
  130. {
  131. printk(KERN_NOTICE "NetSc520 flash device: %lx at %lxn", netsc520_map.size, netsc520_map.map_priv_2);
  132. netsc520_map.map_priv_1 = (unsigned long)ioremap_nocache(netsc520_map.map_priv_2, netsc520_map.size);
  133. if (!netsc520_map.map_priv_1) {
  134. printk("Failed to ioremap_nocachen");
  135. return -EIO;
  136. }
  137. mymtd = do_map_probe("cfi_probe", &netsc520_map);
  138. if(!mymtd)
  139. mymtd = do_map_probe("map_ram", &netsc520_map);
  140. if(!mymtd)
  141. mymtd = do_map_probe("map_rom", &netsc520_map);
  142. if (!mymtd) {
  143. iounmap((void *)netsc520_map.map_priv_1);
  144. return -ENXIO;
  145. }
  146. mymtd->module = THIS_MODULE;
  147. add_mtd_partitions( mymtd, partition_info, NUM_PARTITIONS );
  148. return 0;
  149. }
  150. static void __exit cleanup_netsc520(void)
  151. {
  152. if (mymtd) {
  153. del_mtd_partitions(mymtd);
  154. map_destroy(mymtd);
  155. }
  156. if (netsc520_map.map_priv_1) {
  157. iounmap((void *)netsc520_map.map_priv_1);
  158. netsc520_map.map_priv_1 = 0;
  159. }
  160. }
  161. module_init(init_netsc520);
  162. module_exit(cleanup_netsc520);
  163. MODULE_LICENSE("GPL");
  164. MODULE_AUTHOR("Mark Langsdorf <mark.langsdorf@amd.com>");
  165. MODULE_DESCRIPTION("MTD map driver for AMD NetSc520 Demonstration Board");