Виж само едно мнение
  #1  
Стар 25-05-2009
Аватара на netman
netman netman не е на линия
Жичкаджия
 

Дата на присъединяване: Dec 2007
Местоположение: Бургаско
Мнения: 1,815
Благодари: 400
Получил благодарност:
301 пъти в 146 поста
Сваляния: 114
Ъплоуди: 1
По подразбиране Dbox2 и SD/MMC карта

Цитирай:
Първоначално написано от jonia


Тук има описание на сръбски, а тук на английски, обаче с бегло разглеждане май има разлика в номерата на пиновете на модемният слот. Така че въпреки простотата, освен имидж с поддръжка на SD/MMC , ще трябва уточняване на схемата при чичко Гугъл...
Код:
guenther	06/07/28 14:09:55

  Added:	   mmc	  mmc2test.c mmc3test.c
  Log:
  add mmc test files in head
  
  Revision  Changes	Path
  1.1				  driver/mmc/mmc2test.c
  
  file : http://cvs.tuxbox.org/tuxbox/driver/mmc/mmc2test.c?rev=1.1&content-type=text/vnd.viewcvs-markup
  plain: http://cvs.tuxbox.org/tuxbox/driver/mmc/mmc2test.c?rev=1.1&content-type=text/plain
  
  Index: mmc2test.c
  ===================================================================
  //  $Id: mmc2test.c,v 1.1 2006/07/28 12:09:55 guenther Exp $
  //
  //  MMC2_test.c - Development Version ONLY !!!!!
  //  General MMC device driver
  //  Modem connector pins PA9,PA8,PB16,PB17 used -> MM2 connection sheme
  //
  //  This version of MMC is used to test various optimisation variants only
  //
  // 24 Jul 2006
  //										   ---- Modem_CN ---
  //										   SAGEM NOKIA  PHIL
  // PA9  = SD_DO = 0x0040 = SD_Card Pin 7   =   2	12	 11
  // PA8  = SD_DI = 0x0080 = SD_Card Pin 2   =   1	11	  9
  // PB17 = SD_CLK= 0x4000 = SD_Card Pin 5   =  10	 2	  7
  // PB16 = SD_CS = 0x8000 = SD_Card Pin 1   =   6	 6	  5
  // GND  =	   = Masse  = SD_Card Pin 3,6 =   3	10	  2
  // VCC  =	   = 3,3V   = SD_Card Pin 4   =   5	16	  x (philips: connect in series 3 Diodes (1N4007) from MODEM_CN 1 to SD/MMC card pin 4)
  //
  // Speed of write Optimisation (MCC_WO) is not tested yet
  // Speed of read  Optimisation (MCC_RO):
  // MCC_RO  1: 10 MB read (51 seconds, 200 kb/s)
  // MCC_RO  2: 10 MB read (38 seconds, 260 kb/s)
  // MCC_RO  3: 10 MB read (34 seconds, 290 kb/s)
  // MCC_RO  4: 10 MB read (35 seconds, 290 kb/s)
  // MCC_RO  6: 10 MB read (31 seconds, 320 kb/s)
  
  // MCC_RO  8: 10 MB read (32 seconds, 310 kb/s)
  // MCC_RO 10: 10 MB read (31 seconds, 320 kb/s)
  // MCC_RO 11: 10 MB read (32 seconds, 310 kb/s)
  
  // Original MMC2 driver: 10 MB read (65 seconds, 150 kb/s).
  //
  
  
  #define MCC_RO 10
  #define MCC_WO 3
  
  #include <linux/delay.h>
  #include <linux/timer.h>
  
  #include <linux/module.h>
  #include <linux/mm.h>
  #include <linux/init.h>
  #include <linux/fs.h>
  #include <linux/blkpg.h>
  #include <linux/hdreg.h>
  #include <linux/major.h>
  #include <asm/uaccess.h>
  #include <asm/io.h>
  #include <asm/8xx_immap.h>
  
  #define DEVICE_NAME "mmc"
  #define DEVICE_NR(device) (MINOR(device))
  #define DEVICE_ON(device)
  #define DEVICE_OFF(device)
  #define MAJOR_NR 121
  
  #include <linux/blk.h>
  
  MODULE_AUTHOR("Madsuk/Rohde/TaGana");
  MODULE_DESCRIPTION("Driver MMC/SD-Cards");
  MODULE_SUPPORTED_DEVICE("all dbox2 on com2 connector");
  MODULE_LICENSE("GPL");
  
  unsigned int mmc_error_counter[20]={0,};
  unsigned int mmc_diag_counter[20]={0,};
  unsigned int mmc_time_counter[20]={0xffffffff,0,0xffffffff,0,0xffffffff,0,0xffffffff,0,0xffffffff,0,0xfffffff
f,0};
  
  typedef unsigned int uint32;
  
  /* we have only one device */
  static int hd_sizes[1<<6];
  static int hd_blocksizes[1<<6];
  static int hd_hardsectsizes[1<<6];
  static int hd_maxsect[1<<6];
  static struct hd_struct hd[1<<6];
  
  static struct timer_list mmc_timer;
  static int mmc_media_detect = 0;
  static int mmc_media_changed = 1;
  
  static int mmc_open(struct inode *inode, struct file *filp);
  static int mmc_release(struct inode *inode, struct file *filp);
  static int mmc_ioctl(struct inode *inode, struct file *filp, unsigned int cmd, unsigned long arg);
  
  static struct block_device_operations mmc_bdops =
  {
	  open: mmc_open,
	  release: mmc_release,
	  ioctl: mmc_ioctl,
  #if 0
	  check_media_change: mmc_check_media_change,
	  revalidate: mmc_revalidate,
  #endif
  };
  
  static struct gendisk hd_gendisk = {
	  major:		MAJOR_NR,
	  major_name:	DEVICE_NAME,
	  minor_shift:	6,
	  max_p:		1 << 6,
	  part:		hd,
	  sizes:		hd_sizes,
	  fops:		&mmc_bdops,
  };
  
  
  /////////////////////////////////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////////////////////////////////////////////////////////////////
  /////// Low-Level Driver
  /////////////////////////////////////////////////////////////////////////////////////////////////////////
  /////////////////////////////////////////////////////////////////////////////////////////////////////////
  
  volatile immap_t *immap=(immap_t *)IMAP_ADDR;
  
  #define SD_DO_NUM 6			 // on SD/MMC card pin 7
  #define SD_DO (1<<SD_DO_NUM)	//#define SD_DO  0x0040 // on SD/MMC card pin 7
  #define SD_DI  0x0080		   // on SD/MMC card pin 2
  #define SD_CLK 0x4000		   // on SD/MMC card pin 5
  #define SD_CS  0x8000		   // on SD/MMC card pin 1
  
  static void mmc_spi_cs_low(void)
  {
	volatile cpm8xx_t *cp  = (cpm8xx_t *) &immap->im_cpm;
	cp->cp_pbdat &= ~(SD_CS);
  }
  
  static void mmc_spi_cs_high(void)
  {
	volatile cpm8xx_t *cp  = (cpm8xx_t *) &immap->im_cpm;
	cp->cp_pbdat |= SD_CS;
  }
  
  static int mmc_hardware_init(void) {
	  volatile cpm8xx_t *cp  = (cpm8xx_t *) &immap->im_cpm;
	  volatile iop8xx_t *cpi = (iop8xx_t *) &immap->im_ioport;
  
	  mmc_diag_counter[9]++;
	  printk("mmc2: Hardware init\n");
	  cp->cp_pbpar &=   ~(SD_CLK | SD_CS);
	  cp->cp_pbodr &=   ~(SD_CLK | SD_CS);
	  cp->cp_pbdir |=	(SD_CLK | SD_CS);
	  cpi->iop_papar &= ~(SD_DO | SD_DI);
	  cpi->iop_paodr &= ~(SD_DO);
	  cpi->iop_padir |=   SD_DI;
	  cpi->iop_padir &=  ~SD_DO;
  
	  // Clock + CS low
	  cp->cp_pbdat &= ~(SD_CLK | SD_CS);
	  cpi->iop_padat &= ~SD_DI;
	  return 0;
  }
  
  static unsigned char mmc_spi_io(unsigned char data_out) {
	volatile cpm8xx_t *cp  = (cpm8xx_t *) &immap->im_cpm;
	volatile iop8xx_t *cpi = (iop8xx_t *) &immap->im_ioport;
	unsigned char result = 0;
	unsigned char  i;
  
	for(i = 0x80; i != 0; i >>= 1) {
	  if (data_out & i)
		cpi->iop_padat |= SD_DI;
	  else
		cpi->iop_padat &= ~SD_DI;
  
	  cp->cp_pbdat |= SD_CLK;
	  if (cpi->iop_padat & SD_DO) {
		  result |= i;
	  }
	  cp->cp_pbdat &= ~SD_CLK;
	}
  
	return result;
  }
  
  /////////////////////////////
  /// write variants
  #if (MCC_WO == 1)
  static inline void mmc_spi_write(unsigned char data_out) {
	volatile cpm8xx_t *cp  = (cpm8xx_t *) &immap->im_cpm;
	volatile iop8xx_t *cpi = (iop8xx_t *) &immap->im_ioport;
	unsigned char  i;
  
	for(i = 0x80; i != 0; i >>= 1) {
	  if (data_out & i)
		cpi->iop_padat |= SD_DI;
	  else
		cpi->iop_padat &= ~SD_DI;
  
	  cp->cp_pbdat |= SD_CLK;
  
	  cp->cp_pbdat &= ~SD_CLK;
	}
  }
  #endif
  #if (MCC_WO == 2)
  void inline mmc_spi_write(unsigned char data_out) {
	volatile cpm8xx_t *cp  = (cpm8xx_t *) &immap->im_cpm;
	volatile iop8xx_t *cpi = (iop8xx_t *) &immap->im_ioport;
	  <<Truncated>>
.
Отговори с цитат