LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 2811|回复: 15

教程: TI xx21/xx12 读卡器开启 SD 卡支持(Acer 笔记本用户尤其注意)

[复制链接]
发表于 2006-9-8 03:35:12 | 显示全部楼层 |阅读模式
此驱动是实验性的,稳定速度在 4M/s,最高速度在 20M/s 以上
测试阶段,使用的话后果自。

如果不是 SLE 10 和 SUSE 10.1
首先确定你用的是 2.6.16 以上内核
且开启 mmc 支持 ( SUSE 默认开启 )

http://prdownload.berlios.de/tifmxx/tifm-0.6b.tar.bz2
下载最新 tifm 0.6 Beta驱动。

此项目主页在 http://developer.berlios.de/projects/tifmxx

确定自己安装了 kernel-source gcc make 等包

去下载目录解压

$tar jxf tifm-0.6b.tar.bz2

会出现几个源文件,在同一目录写一个 Makefile,或者下载我写的(见附件)然后解压到同一个目录,开终端

$su
输入密码
#make
如果没有出现错误提示
#cp *.ko /lib/modules/`uname -r`/kernel/drivers/mmc
#depmod
#modeprobe mmc_block
#insmod  /lib/modules/`uname -r`/kernel/drivers/mmc/tifm_core.ko
#insmod  /lib/modules/`uname -r`/kernel/drivers/mmc/tifm_sd.ko
#insmod  /lib/modules/`uname -r`/kernel/drivers/mmc/tifm_7xx1.ko

插入你的 SD 卡,会自动检测且挂载。
如果你自行编译了纯净内核没打 flush-o-fat 补丁,不会自动挂载,你可以手动挂载 /dev/mmcblk0p1

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
 楼主| 发表于 2006-9-8 03:35:12 | 显示全部楼层 |阅读模式
此驱动是实验性的,稳定速度在 4M/s,最高速度在 20M/s 以上
测试阶段,使用的话后果自。

如果不是 SLE 10 和 SUSE 10.1
首先确定你用的是 2.6.16 以上内核
且开启 mmc 支持 ( SUSE 默认开启 )

http://prdownload.berlios.de/tifmxx/tifm-0.6b.tar.bz2
下载最新 tifm 0.6 Beta驱动。

此项目主页在 http://developer.berlios.de/projects/tifmxx

确定自己安装了 kernel-source gcc make 等包

去下载目录解压

$tar jxf tifm-0.6b.tar.bz2

会出现几个源文件,在同一目录写一个 Makefile,或者下载我写的(见附件)然后解压到同一个目录,开终端

$su
输入密码
#make
如果没有出现错误提示
#cp *.ko /lib/modules/`uname -r`/kernel/drivers/mmc
#depmod
#modeprobe mmc_block
#insmod  /lib/modules/`uname -r`/kernel/drivers/mmc/tifm_core.ko
#insmod  /lib/modules/`uname -r`/kernel/drivers/mmc/tifm_sd.ko
#insmod  /lib/modules/`uname -r`/kernel/drivers/mmc/tifm_7xx1.ko

插入你的 SD 卡,会自动检测且挂载。
如果你自行编译了纯净内核没打 flush-o-fat 补丁,不会自动挂载,你可以手动挂载 /dev/mmcblk0p1

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
 楼主| 发表于 2006-9-8 03:42:47 | 显示全部楼层
此驱动目前仅仅支持 SD/uSD 卡设备
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-9-8 03:42:56 | 显示全部楼层
此驱动目前仅仅支持 SD/uSD 卡设备
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-9-8 04:18:27 | 显示全部楼层
此时,中等文件传输已经可以实现了,而且速度很快
如果传输大文件会失败
你需要一个内核补丁然后重新编译相应模块来修正这个问题

[MMC] Fix SD timeout calculation

Secure Digital cards use a different algorithm to calculate the timeout
for data transfers. Using the MMC one works often, but not always.

Signed-off-by: Pierre Ossman <drzeus@drzeus.cx>
---
drivers/mmc/mmc.c       |   15 +++++++++++++--
drivers/mmc/mmc_block.c |   44 ++++++++++++++++++++++++++++++++++++--------
2 files changed, 49 insertions(+), 10 deletions(-)
diff --git a/drivers/mmc/mmc.c b/drivers/mmc/mmc.c
index 33525bd..c0c7ef2 100644
--- a/drivers/mmc/mmc.c
+++ b/drivers/mmc/mmc.c
@@ -912,6 +912,7 @@ static void mmc_read_scrs(struct mmc_hos
        struct mmc_request mrq;
        struct mmc_command cmd;
        struct mmc_data data;
+        unsigned int timeout_us;

        struct scatterlist sg;

@@ -947,8 +948,18 @@ static void mmc_read_scrs(struct mmc_hos

                memset(&data, 0, sizeof(struct mmc_data));

-                data.timeout_ns = card->csd.tacc_ns * 10;
-                data.timeout_clks = card->csd.tacc_clks * 10;
+                data.timeout_ns = card->csd.tacc_ns * 100;
+                data.timeout_clks = card->csd.tacc_clks * 100;
+
+                timeout_us = data.timeout_ns / 1000;
+                timeout_us += data.timeout_clks * 1000 /
+                        (host->ios.clock / 1000);
+
+                if (timeout_us > 100000) {
+                        data.timeout_ns = 100000000;
+                        data.timeout_clks = 0;
+                }
+
                data.blksz_bits = 3;
                data.blksz = 1 << 3;
                data.blocks = 1;
diff --git a/drivers/mmc/mmc_block.c b/drivers/mmc/mmc_block.c
index e033424..cb7fc8d 100644
--- a/drivers/mmc/mmc_block.c
+++ b/drivers/mmc/mmc_block.c
@@ -30,6 +30,7 @@ #include <linux/blkdev.h>
#include <linux/mutex.h>

#include <linux/mmc/card.h>
+#include <linux/mmc/host.h>
#include <linux/mmc/protocol.h>

#include <asm/system.h>
@@ -171,8 +172,6 @@ static int mmc_blk_issue_rq(struct mmc_q

                brq.cmd.arg = req->sector << 9;
                brq.cmd.flags = MMC_RSP_R1 | MMC_CMD_ADTC;
-                brq.data.timeout_ns = card->csd.tacc_ns * 10;
-                brq.data.timeout_clks = card->csd.tacc_clks * 10;
                brq.data.blksz_bits = md->block_bits;
                brq.data.blksz = 1 << md->block_bits;
                brq.data.blocks = req->nr_sectors >> (md->block_bits - 9);
@@ -180,6 +179,41 @@ static int mmc_blk_issue_rq(struct mmc_q
                brq.stop.arg = 0;
                brq.stop.flags = MMC_RSP_R1B | MMC_CMD_AC;

+                brq.data.timeout_ns = card->csd.tacc_ns * 10;
+                brq.data.timeout_clks = card->csd.tacc_clks * 10;
+
+                /*
+                 * Scale up the timeout by the r2w factor
+                 */
+                if (rq_data_dir(req) == WRITE) {
+                        brq.data.timeout_ns <<= card->csd.r2w_factor;
+                        brq.data.timeout_clks <<= card->csd.r2w_factor;
+                }
+
+                /*
+                 * SD cards use a 100 multiplier and has a upper limit
+                 */
+                if (mmc_card_sd(card)) {
+                        unsigned int limit_us, timeout_us;
+
+                        brq.data.timeout_ns *= 10;
+                        brq.data.timeout_clks *= 10;
+
+                        if (rq_data_dir(req) == READ)
+                                limit_us = 100000;
+                        else
+                                limit_us = 250000;
+
+                        timeout_us = brq.data.timeout_ns / 1000;
+                        timeout_us += brq.data.timeout_clks * 1000 /
+                                (card->host->ios.clock / 1000);
+
+                        if (timeout_us > limit_us) {
+                                brq.data.timeout_ns = limit_us * 1000;
+                                brq.data.timeout_clks = 0;
+                        }
+                }
+
                if (rq_data_dir(req) == READ) {
                        brq.cmd.opcode = brq.data.blocks > 1 ? MMC_READ_MULTIPLE_BLOCK : MMC_READ_SINGLE_BLOCK;
                        brq.data.flags |= MMC_DATA_READ;
@@ -187,12 +221,6 @@ static int mmc_blk_issue_rq(struct mmc_q
                        brq.cmd.opcode = MMC_WRITE_BLOCK;
                        brq.data.flags |= MMC_DATA_WRITE;
                        brq.data.blocks = 1;
-
-                        /*
-                         * Scale up the timeout by the r2w factor
-                         */
-                        brq.data.timeout_ns <<= card->csd.r2w_factor;
-                        brq.data.timeout_clks <<= card->csd.r2w_factor;
                }

                if (brq.data.blocks > 1) {
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-9-8 04:18:53 | 显示全部楼层
如果你对 SD 卡的需求仅限于传照片之类上面就足够了
如果你要进行上百M的文件传输,下面这个内核补丁必不可少,然后编译相应模块。

[MMC] Fix SD timeout calculation

Secure Digital cards use a different algorithm to calculate the timeout
for data transfers. Using the MMC one works often, but not always.

Signed-off-by: Pierre Ossman <drzeus@drzeus.cx>
---
drivers/mmc/mmc.c       |   15 +++++++++++++--
drivers/mmc/mmc_block.c |   44 ++++++++++++++++++++++++++++++++++++--------
2 files changed, 49 insertions(+), 10 deletions(-)
diff --git a/drivers/mmc/mmc.c b/drivers/mmc/mmc.c
index 33525bd..c0c7ef2 100644
--- a/drivers/mmc/mmc.c
+++ b/drivers/mmc/mmc.c
@@ -912,6 +912,7 @@ static void mmc_read_scrs(struct mmc_hos
        struct mmc_request mrq;
        struct mmc_command cmd;
        struct mmc_data data;
+        unsigned int timeout_us;

        struct scatterlist sg;

@@ -947,8 +948,18 @@ static void mmc_read_scrs(struct mmc_hos

                memset(&data, 0, sizeof(struct mmc_data));

-                data.timeout_ns = card->csd.tacc_ns * 10;
-                data.timeout_clks = card->csd.tacc_clks * 10;
+                data.timeout_ns = card->csd.tacc_ns * 100;
+                data.timeout_clks = card->csd.tacc_clks * 100;
+
+                timeout_us = data.timeout_ns / 1000;
+                timeout_us += data.timeout_clks * 1000 /
+                        (host->ios.clock / 1000);
+
+                if (timeout_us > 100000) {
+                        data.timeout_ns = 100000000;
+                        data.timeout_clks = 0;
+                }
+
                data.blksz_bits = 3;
                data.blksz = 1 << 3;
                data.blocks = 1;
diff --git a/drivers/mmc/mmc_block.c b/drivers/mmc/mmc_block.c
index e033424..cb7fc8d 100644
--- a/drivers/mmc/mmc_block.c
+++ b/drivers/mmc/mmc_block.c
@@ -30,6 +30,7 @@ #include <linux/blkdev.h>
#include <linux/mutex.h>

#include <linux/mmc/card.h>
+#include <linux/mmc/host.h>
#include <linux/mmc/protocol.h>

#include <asm/system.h>
@@ -171,8 +172,6 @@ static int mmc_blk_issue_rq(struct mmc_q

                brq.cmd.arg = req->sector << 9;
                brq.cmd.flags = MMC_RSP_R1 | MMC_CMD_ADTC;
-                brq.data.timeout_ns = card->csd.tacc_ns * 10;
-                brq.data.timeout_clks = card->csd.tacc_clks * 10;
                brq.data.blksz_bits = md->block_bits;
                brq.data.blksz = 1 << md->block_bits;
                brq.data.blocks = req->nr_sectors >> (md->block_bits - 9);
@@ -180,6 +179,41 @@ static int mmc_blk_issue_rq(struct mmc_q
                brq.stop.arg = 0;
                brq.stop.flags = MMC_RSP_R1B | MMC_CMD_AC;

+                brq.data.timeout_ns = card->csd.tacc_ns * 10;
+                brq.data.timeout_clks = card->csd.tacc_clks * 10;
+
+                /*
+                 * Scale up the timeout by the r2w factor
+                 */
+                if (rq_data_dir(req) == WRITE) {
+                        brq.data.timeout_ns <<= card->csd.r2w_factor;
+                        brq.data.timeout_clks <<= card->csd.r2w_factor;
+                }
+
+                /*
+                 * SD cards use a 100 multiplier and has a upper limit
+                 */
+                if (mmc_card_sd(card)) {
+                        unsigned int limit_us, timeout_us;
+
+                        brq.data.timeout_ns *= 10;
+                        brq.data.timeout_clks *= 10;
+
+                        if (rq_data_dir(req) == READ)
+                                limit_us = 100000;
+                        else
+                                limit_us = 250000;
+
+                        timeout_us = brq.data.timeout_ns / 1000;
+                        timeout_us += brq.data.timeout_clks * 1000 /
+                                (card->host->ios.clock / 1000);
+
+                        if (timeout_us > limit_us) {
+                                brq.data.timeout_ns = limit_us * 1000;
+                                brq.data.timeout_clks = 0;
+                        }
+                }
+
                if (rq_data_dir(req) == READ) {
                        brq.cmd.opcode = brq.data.blocks > 1 ? MMC_READ_MULTIPLE_BLOCK : MMC_READ_SINGLE_BLOCK;
                        brq.data.flags |= MMC_DATA_READ;
@@ -187,12 +221,6 @@ static int mmc_blk_issue_rq(struct mmc_q
                        brq.cmd.opcode = MMC_WRITE_BLOCK;
                        brq.data.flags |= MMC_DATA_WRITE;
                        brq.data.blocks = 1;
-
-                        /*
-                         * Scale up the timeout by the r2w factor
-                         */
-                        brq.data.timeout_ns <<= card->csd.r2w_factor;
-                        brq.data.timeout_clks <<= card->csd.r2w_factor;
                }

                if (brq.data.blocks > 1) {
回复 支持 反对

使用道具 举报

发表于 2006-9-8 13:39:27 | 显示全部楼层
读卡器是那种五合一的么
我的读卡器的牌子好象是 ENE 什么的,TI xx21/xx12 是读卡器里面的芯片么?
先确定一下是否对得上
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-9-8 14:42:38 | 显示全部楼层
#lspci -n
如果有 104c:8033 或者 104c:803b 字样则你有此设备
回复 支持 反对

使用道具 举报

发表于 2006-9-8 14:56:47 | 显示全部楼层
多谢,回去后试一试
回复 支持 反对

使用道具 举报

发表于 2006-9-8 17:40:59 | 显示全部楼层
我的ASUS笔记本有个读卡槽,其中有SD卡一项。我用“lspci -v”后得到的结果是:
03:03.2 Class 0805: Ricoh Co Ltd R5C822 SD/SDIO/MMC/MS/MSPro Host Adapter (rev 17)
        Subsystem: ASUSTeK Computer Inc. Unknown device 1977
        Flags: bus master, medium devsel, latency 64, IRQ 5
        Memory at feaf9c00 (32-bit, non-prefetchable) [size=256]
        Capabilities: [80] Power Management version 2


可是用“lspci -n”后没有“104c:8033 或者 104c:803b”字样。

我这种情况还能用版主的方法吗?
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表