Код:
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>>