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

嵌入式Linux

开发平台:

Unix_Linux

  1. /*
  2.  * linux/arch/arm/mach-sa1100/simpad.c
  3.  *
  4.  */
  5. #include <linux/config.h>
  6. #include <linux/module.h>
  7. #include <linux/init.h>
  8. #include <linux/kernel.h>
  9. #include <linux/tty.h>
  10. #include <linux/proc_fs.h>
  11. #include <linux/string.h> 
  12. #include <asm/hardware.h>
  13. #include <asm/setup.h>
  14. #include <asm/mach/arch.h>
  15. #include <asm/mach/map.h>
  16. #include <asm/mach/serial_sa1100.h>
  17. #include <linux/serial_core.h>
  18. #include "generic.h"
  19. long cs3_shadow;
  20. long get_cs3_shadow()
  21. {
  22. return cs3_shadow;
  23. }
  24. void set_cs3_bit(int value)
  25. {
  26. cs3_shadow |= value;
  27. *(CS3BUSTYPE *)(CS3_BASE) = cs3_shadow;
  28. }
  29. void clear_cs3_bit(int value)
  30. {
  31. cs3_shadow &= ~value;
  32. *(CS3BUSTYPE *)(CS3_BASE) = cs3_shadow;
  33. }
  34. static void __init
  35. fixup_simpad(struct machine_desc *desc, struct param_struct *params,
  36.    char **cmdline, struct meminfo *mi)
  37. {
  38. #ifdef CONFIG_SA1100_SIMPAD_DRAM_64MB /* DRAM */
  39. SET_BANK( 0, 0xc0000000, 64*1024*1024 );
  40. #else
  41. SET_BANK( 0, 0xc0000000, 32*1024*1024 );
  42. #endif
  43. mi->nr_banks = 1;
  44. ROOT_DEV = MKDEV(RAMDISK_MAJOR,0);
  45. setup_ramdisk( 1, 0, 0, 8192 );
  46. setup_initrd( __phys_to_virt(0xc0800000), 4*1024*1024 );
  47. }
  48. static struct map_desc simpad_io_desc[] __initdata = {
  49.   /* virtual physical    length domain    r  w  c  b */
  50.   { 0xe8000000, 0x00000000, 0x02000000, DOMAIN_IO, 0, 1, 0, 0 }, 
  51.   { 0xf2800000, 0x4b800000, 0x00800000, DOMAIN_IO, 0, 1, 0, 0 }, /* MQ200 */  
  52.   { 0xf1000000, 0x18000000, 0x00100000, DOMAIN_IO, 0, 1, 0, 0 }, /* Paules CS3, write only */
  53.   LAST_DESC
  54. };
  55. static void simpad_uart_pm(struct uart_port *port, u_int state, u_int oldstate)
  56. {
  57. if (port->mapbase == (u_int)&Ser1UTCR0) {
  58. if (state)
  59. clear_cs3_bit(RS232_ON);
  60. else
  61. set_cs3_bit(RS232_ON);
  62. }
  63. }
  64. static struct sa1100_port_fns simpad_port_fns __initdata = {
  65. pm: simpad_uart_pm,
  66. };
  67. static void __init simpad_map_io(void)
  68. {
  69. sa1100_map_io();
  70. iotable_init(simpad_io_desc);
  71. PSPR = 0xc0008000;
  72. GPDR &= ~GPIO_GPIO0;
  73. cs3_shadow = (EN1 | EN0 | LED2_ON | DISPLAY_ON | RS232_ON | 
  74.       ENABLE_5V | RESET_SIMCARD);
  75. *(CS3BUSTYPE *)(CS3_BASE) = cs3_shadow;
  76. //It is only possible to register 3 UART in serial_sa1100.c
  77. sa1100_register_uart(0, 3);
  78. sa1100_register_uart(1, 1);
  79. set_GPIO_IRQ_edge(GPIO_UCB1300_IRQ, GPIO_RISING_EDGE);
  80. }
  81. #ifdef CONFIG_PROC_FS
  82. static char* name[]={
  83.   "VCC_5V_EN",
  84.   "VCC_3V_EN",
  85.   "EN1",
  86.   "EN0",
  87.   "DISPLAY_ON",
  88.   "PCMCIA_BUFF_DIS",
  89.   "MQ_RESET",
  90.   "PCMCIA_RESET",
  91.   "DECT_POWER_ON",
  92.   "IRDA_SD",
  93.   "RS232_ON",
  94.   "SD_MEDIAQ",
  95.   "LED2_ON",
  96.   "IRDA_MODE",
  97.   "ENABLE_5V",
  98.   "RESET_SIMCARD"
  99. };
  100. static int proc_cs3_read(char *page, char **start, off_t off,
  101.   int count, int *eof, void *data)
  102. {
  103. char *p = page;
  104. int len, i;
  105.         
  106. p += sprintf(p, "Chipselect3 : %xn", cs3_shadow);
  107. for (i = 0; i <= 15; i++) {
  108. if(cs3_shadow & (1<<i)) {
  109. p += sprintf(p, "%st: TRUE n",name[i]);
  110. } else
  111. p += sprintf(p, "%st: FALSE n",name[i]);
  112. }
  113. len = (p - page) - off;
  114. if (len < 0)
  115. len = 0;
  116.  
  117. *eof = (len <= count) ? 1 : 0;
  118. *start = page + off;
  119.  
  120. return len;
  121. }
  122.  
  123.  
  124. static struct proc_dir_entry *proc_cs3;
  125.  
  126. static int __init cs3_init(void)
  127. {
  128. proc_cs3 = create_proc_entry("cs3", 0, 0);
  129. if (proc_cs3)
  130. proc_cs3->read_proc = proc_cs3_read;
  131. return 0;
  132. }
  133.  
  134. static int __exit cs3_exit(void)
  135. {
  136. if (proc_cs3)
  137. remove_proc_entry( "cs3", 0);
  138. return 0;
  139. }    
  140. __initcall(cs3_init);
  141. #endif // CONFIG_PROC_FS
  142. MACHINE_START(SIMPAD, "Simpad")
  143. MAINTAINER("Juergen Messerer")
  144. BOOT_MEM(0xc0000000, 0x80000000, 0xf8000000)
  145. FIXUP(fixup_simpad)
  146. MAPIO(simpad_map_io)
  147. INITIRQ(sa1100_init_irq)
  148. MACHINE_END