发新帖我要提问
12
返回列表
打印

准备作一批at91rm9200了

[复制链接]
楼主: wangkj
手机看帖
扫描二维码
随时随地手机跟帖
21
wangkj|  楼主 | 2007-7-17 08:01 | 只看该作者 回帖奖励 |倒序浏览

楼上的真是德国汽车—本司了

我的web服务器都开了星期了,这两天调sd卡关了。

使用特权

评论回复
22
wangkj|  楼主 | 2007-7-17 11:19 | 只看该作者

sd卡驱动补丁,这是花了我好几天功夫才搞定的。

已经没有问题了。
看来以后都升级内核到2.6.22以后的版本,2.6.21的sd卡有问题。
diff -urN linux-2.6.21.old/drivers/mmc/at91_mci.c linux-2.6.21/drivers/mmc/at91_mci.c
--- linux-2.6.21.old/drivers/mmc/at91_mci.c    2007-07-09 19:55:27.000000000 +0800
+++ linux-2.6.21/drivers/mmc/at91_mci.c    2007-07-10 05:54:03.000000000 +0800
@@ -79,9 +79,6 @@
 
 #define DRIVER_NAME "at91_mci"
 
-#undef    SUPPORT_4WIRE
-//#define SUPPORT_4WIRE
-
 #define FL_SENT_COMMAND    (1 << 0)
 #define FL_SENT_STOP    (1 << 1)
 
@@ -133,7 +130,7 @@
 /*
  * Copy from sg to a dma block - used for transfers
  */
-static inline void at91mci_sg_to_dma(struct at91mci_host *host, struct mmc_data *data)
+static inline void at91_mci_sg_to_dma(struct at91mci_host *host, struct mmc_data *data)
 {
     unsigned int len, i, size;
     unsigned *dmabuf = host->buffer;
@@ -182,7 +179,7 @@
 /*
  * Prepare a dma read
  */
-static void at91mci_pre_dma_read(struct at91mci_host *host)
+static void at91_mci_pre_dma_read(struct at91mci_host *host)
 {
     int i;
     struct scatterlist *sg;
@@ -250,7 +247,7 @@
 /*
  * Handle after a dma read
  */
-static void at91mci_post_dma_read(struct at91mci_host *host)
+static void at91_mci_post_dma_read(struct at91mci_host *host)
 {
     struct mmc_command *cmd;
     struct mmc_data *data;
@@ -270,8 +267,6 @@
     }
 
     while (host->in_use_index < host->transfer_index) {
-        unsigned int *buffer;
-
         struct scatterlist *sg;
 
         pr_debug("finishing index %d ", host->in_use_index);
@@ -282,29 +277,30 @@
 
         dma_unmap_page(NULL, sg->dma_address, sg->length, DMA_FROM_DEVICE);
 
-        /* Swap the contents of the buffer */
-        buffer = kmap_atomic(sg->page, KM_BIO_SRC_IRQ) + sg->offset;
-        pr_debug("buffer = %p, length = %d ", buffer, sg->length);
-
         data->bytes_xfered += sg->length;
 
         if (cpu_is_at91rm9200()) {    /* AT91RM9200 errata */
+            unsigned int *buffer;
             int index;
 
+            /* Swap the contents of the buffer */
+            buffer = kmap_atomic(sg->page, KM_BIO_SRC_IRQ) + sg->offset;
+            pr_debug("buffer = %p, length = %d ", buffer, sg->length);
+
             for (index = 0; index < (sg->length / 4); index++)
                 buffer[index] = swab32(buffer[index]);
+            kunmap_atomic(buffer, KM_BIO_SRC_IRQ);
         }
 
-        kunmap_atomic(buffer, KM_BIO_SRC_IRQ);
         flush_dcache_page(sg->page);
     }
 
     /* Is there another transfer to trigger? */
     if (host->transfer_index < data->sg_len)
-        at91mci_pre_dma_read(host);
+        at91_mci_pre_dma_read(host);
     else {
+        at91_mci_write(host, AT91_MCI_IDR, AT91_MCI_ENDRX);
         at91_mci_write(host, AT91_MCI_IER, AT91_MCI_RXBUFF);
-        at91_mci_write(host, ATMEL_PDC_PTCR, ATMEL_PDC_RXTDIS | ATMEL_PDC_TXTDIS);
     }
 
     pr_debug("post dma read done ");
@@ -325,7 +321,6 @@
 
     /* Now wait for cmd ready */
     at91_mci_write(host, AT91_MCI_IDR, AT91_MCI_TXBUFE);
-    at91_mci_write(host, AT91_MCI_IER, AT91_MCI_NOTBUSY);
 
     cmd = host->cmd;
     if (!cmd) return;
@@ -333,18 +328,55 @@
     data = cmd->data;
     if (!data) return;
 
+    if (cmd->data->flags & MMC_DATA_MULTI) {
+        pr_debug("multiple write : wait for BLKE... ");
+        at91_mci_write(host, AT91_MCI_IER, AT91_MCI_BLKE);
+    } 
+    else
+        at91_mci_write(host, AT91_MCI_IER, AT91_MCI_NOTBUSY);
+
     data->bytes_xfered = host->total_length;
 }
 
+/*Handle after command sent ready*/
+static int at91_mci_handle_cmdrdy(struct at91mci_host *host)
+{
+     if (!host->cmd)
+         return 1;
+     else if (!host->cmd->data) {
+         if (host->flags & FL_SENT_STOP) {
+                 /*After multi block write, we must wait for NOTBUSY*/
+                 at91_mci_write(host, AT91_MCI_IER, AT91_MCI_NOTBUSY);
+             } else 
+                return 1;
+         } 
+        else if (host->cmd->data->flags & MMC_DATA_WRITE) {
+            /*After sendding multi-block-write command, start DMA transfer*/
+             at91_mci_write(host, AT91_MCI_IER, AT91_MCI_TXBUFE);
+             at91_mci_write(host, AT91_MCI_IER, AT91_MCI_BLKE);
+             at91_mci_write(host, ATMEL_PDC_PTCR, ATMEL_PDC_TXTEN);
+             }
+
+     /* command not completed, have to wait */
+     return 0;
+}
+
 /*
  * Enable the controller
  */
 static void at91_mci_enable(struct at91mci_host *host)
 {
+    unsigned int mr;
+
     at91_mci_write(host, AT91_MCI_CR, AT91_MCI_MCIEN);
     at91_mci_write(host, AT91_MCI_IDR, 0xffffffff);
     at91_mci_write(host, AT91_MCI_DTOR, AT91_MCI_DTOMUL_1M | AT91_MCI_DTOCYC);
-    at91_mci_write(host, AT91_MCI_MR, AT91_MCI_PDCMODE | 0x34a);
+    mr = AT91_MCI_PDCMODE | 0x34a;
+
+     if (cpu_is_at91sam9260() || cpu_is_at91sam9263())
+         mr |= AT91_MCI_RDPROOF | AT91_MCI_WRPROOF;
+
+     at91_mci_write(host, AT91_MCI_MR, mr);
 
     /* use Slot A or B (only one at same time) */
     at91_mci_write(host, AT91_MCI_SDCR, host->board->slot_b);
@@ -360,9 +392,8 @@
 
 /*
  * Send a command
- * return the interrupts to enable
  */
-static unsigned int at91_mci_send_command(struct at91mci_host *host, struct mmc_command *cmd)
+static void at91_mci_send_command(struct at91mci_host *host, struct mmc_command *cmd)
 {
     unsigned int cmdr, mr;
     unsigned int block_length;
@@ -373,8 +404,7 @@
 
     host->cmd = cmd;
 
-    /* Not sure if this is needed */
-#if 0
+/* Needed for leaving busy state before CMD1 */
     if ((at91_mci_read(host, AT91_MCI_SR) & AT91_MCI_RTOE) && (cmd->opcode == 1)) {
         pr_debug("Clearing timeout ");
         at91_mci_write(host, AT91_MCI_ARGR, 0);
@@ -384,7 +414,7 @@
             pr_debug("Clearing: SR = %08X ", at91_mci_read(host, AT91_MCI_SR));
         }
     }
-#endif
+
     cmdr = cmd->opcode;
 
     if (mmc_resp_type(cmd) == MMC_RSP_NONE)
@@ -441,50 +471,50 @@
         at91_mci_write(host, ATMEL_PDC_TCR, 0);
         at91_mci_write(host, ATMEL_PDC_TNPR, 0);
         at91_mci_write(host, ATMEL_PDC_TNCR, 0);
-
-        at91_mci_write(host, AT91_MCI_ARGR, cmd->arg);
-        at91_mci_write(host, AT91_MCI_CMDR, cmdr);
-        return AT91_MCI_CMDRDY;
-    }
-
-    mr = at91_mci_read(host, AT91_MCI_MR) & 0x7fff;    /* zero block length and PDC mode */
-    at91_mci_write(host, AT91_MCI_MR, mr | (block_length << 16) | AT91_MCI_PDCMODE);
-
-    /*
-     * Disable the PDC controller
-     */
-    at91_mci_write(host, ATMEL_PDC_PTCR, ATMEL_PDC_RXTDIS | ATMEL_PDC_TXTDIS);
-
-    if (cmdr & AT91_MCI_TRCMD_START) {
-        data->bytes_xfered = 0;
-        host->transfer_index = 0;
-        host->in_use_index = 0;
-        if (cmdr & AT91_MCI_TRDIR) {
+        ier = AT91_MCI_CMDRDY;
+    } 
+    else 
+    {
+        /* zero block length and PDC mode */
+        mr = at91_mci_read(host, AT91_MCI_MR) & 0x7fff;
+        at91_mci_write(host, AT91_MCI_MR, mr | (block_length << 16) | AT91_MCI_PDCMODE);
+
+         /*
+         * Disable the PDC controller
+         */
+         at91_mci_write(host, ATMEL_PDC_PTCR, ATMEL_PDC_RXTDIS | ATMEL_PDC_TXTDIS);
+
+        if (cmdr & AT91_MCI_TRCMD_START) {
+            data->bytes_xfered = 0;
+            host->transfer_index = 0;
+            host->in_use_index = 0;
+            if (cmdr & AT91_MCI_TRDIR) {
             /*
-             * Handle a read
-             */
-            host->buffer = NULL;
-            host->total_length = 0;
+            * Handle a read
+            */
+                host->buffer = NULL;
+                host->total_length = 0;
+                at91_mci_pre_dma_read(host);
+                ier = AT91_MCI_ENDRX /* | AT91_MCI_RXBUFF */;
+            }        
+            else {
+                /*
+                * Handle a write
+                */
+                host->total_length = block_length * blocks;
+                host->buffer = dma_alloc_coherent(NULL,
+                host->total_length,
+                &host->physical_address, GFP_KERNEL);
+
+                at91_mci_sg_to_dma(host, data);
+
+                pr_debug("Transmitting %d bytes ", host->total_length);
+
+                at91_mci_write(host, ATMEL_PDC_TPR, host->physical_address);
+                at91_mci_write(host, ATMEL_PDC_TCR, host->total_length / 4);
+                ier = AT91_MCI_CMDRDY;
+            }    
 
-            at91mci_pre_dma_read(host);
-            ier = AT91_MCI_ENDRX /* | AT91_MCI_RXBUFF */;
-        }
-        else {
-            /*
-             * Handle a write
-             */
-            host->total_length = block_length * blocks;
-            host->buffer = dma_alloc_coherent(NULL,
-                          host->total_length,
-                          &host->physical_address, GFP_KERNEL);
-
-            at91mci_sg_to_dma(host, data);
-
-            pr_debug("Transmitting %d bytes ", host->total_length);
-
-            at91_mci_write(host, ATMEL_PDC_TPR, host->physical_address);
-            at91_mci_write(host, ATMEL_PDC_TCR, host->total_length / 4);
-            ier = AT91_MCI_TXBUFE;
         }
     }
 
@@ -499,39 +529,23 @@
     if (cmdr & AT91_MCI_TRCMD_START) {
         if (cmdr & AT91_MCI_TRDIR)
             at91_mci_write(host, ATMEL_PDC_PTCR, ATMEL_PDC_RXTEN);
-        else
-            at91_mci_write(host, ATMEL_PDC_PTCR, ATMEL_PDC_TXTEN);
     }
-    return ier;
-}
-
-/*
- * Wait for a command to complete
- */
-static void at91mci_process_command(struct at91mci_host *host, struct mmc_command *cmd)
-{
-    unsigned int ier;
-
-    ier = at91_mci_send_command(host, cmd);
-
-    pr_debug("setting ier to %08X ", ier);
-
-    /* Stop on errors or the required value */
+    /* Enable selected interrupts */
     at91_mci_write(host, AT91_MCI_IER, AT91_MCI_ERRORS | ier);
 }
 
 /*
  * Process the next step in the request
  */
-static void at91mci_process_next(struct at91mci_host *host)
+static void at91_mci_process_next(struct at91mci_host *host)
 {
     if (!(host->flags & FL_SENT_COMMAND)) {
         host->flags |= FL_SENT_COMMAND;
-        at91mci_process_command(host, host->request->cmd);
+         at91_mci_send_command(host, host->request->cmd);
     }
     else if ((!(host->flags & FL_SENT_STOP)) && host->request->stop) {
         host->flags |= FL_SENT_STOP;
-        at91mci_process_command(host, host->request->stop);
+        at91_mci_send_command(host, host->request->stop);
     }
     else
         mmc_request_done(host->mmc, host->request);
@@ -540,7 +554,7 @@
 /*
  * Handle a command that has been completed
  */
-static void at91mci_completed_command(struct at91mci_host *host)
+static void at91_mci_completed_command(struct at91mci_host *host)
 {
     struct mmc_command *cmd = host->cmd;
     unsigned int status;
@@ -584,7 +598,7 @@
     else
         cmd->error = MMC_ERR_NONE;
 
-    at91mci_process_next(host);
+    at91_mci_process_next(host);
 }
 
 /*
@@ -596,7 +610,7 @@
     host->request = mrq;
     host->flags = 0;
 
-    at91mci_process_next(host);
+    at91_mci_process_next(host);
 }
 
 /*
@@ -698,30 +712,33 @@
             pr_debug("TX buffer empty ");
             at91_mci_handle_transmitted(host);
         }
+        if (int_status & AT91_MCI_ENDRX) {
+            pr_debug("ENDRX ");
+            at91_mci_post_dma_read(host);
+        }        
 
         if (int_status & AT91_MCI_RXBUFF) {
             pr_debug("RX buffer full ");
-            at91_mci_write(host, AT91_MCI_IER, AT91_MCI_CMDRDY);
+            at91_mci_write(host, ATMEL_PDC_PTCR, ATMEL_PDC_RXTDIS | ATMEL_PDC_TXTDIS);
+            at91_mci_write(host, AT91_MCI_IDR, AT91_MCI_RXBUFF | AT91_MCI_ENDRX);
+            completed = 1;
         }
 
         if (int_status & AT91_MCI_ENDTX)
             pr_debug("Transmit has ended ");
 
-        if (int_status & AT91_MCI_ENDRX) {
-            pr_debug("Receive has ended ");
-            at91mci_post_dma_read(host);
-        }
-
         if (int_status & AT91_MCI_NOTBUSY) {
             pr_debug("Card is ready ");
-            at91_mci_write(host, AT91_MCI_IER, AT91_MCI_CMDRDY);
+            completed = 1;
         }
 
         if (int_status & AT91_MCI_DTIP)
             pr_debug("Data transfer in progress ");
 
-        if (int_status & AT91_MCI_BLKE)
+        if (int_status & AT91_MCI_BLKE) {
             pr_debug("Block transfer has ended ");
+            completed = 1;
+        }
 
         if (int_status & AT91_MCI_TXRDY)
             pr_debug("Ready to transmit ");
@@ -731,14 +748,14 @@
 
         if (int_status & AT91_MCI_CMDRDY) {
             pr_debug("Command ready ");
-            completed = 1;
+            completed = at91_mci_handle_cmdrdy(host);
         }
     }
 
     if (completed) {
         pr_debug("Completed command ");
         at91_mci_write(host, AT91_MCI_IDR, 0xffffffff);
-        at91mci_completed_command(host);
+        at91_mci_completed_command(host);
     } else
         at91_mci_write(host, AT91_MCI_IDR, int_status);
 
@@ -831,11 +848,12 @@
     host->bus_mode = 0;
     host->board = pdev->dev.platform_data;
     if (host->board->wire4) {
-#ifdef SUPPORT_4WIRE
-        mmc->caps |= MMC_CAP_4_BIT_DATA;
-#else
-        printk("AT91 MMC: 4 wire bus mode not supported by this driver - using 1 wire ");
-#endif
+
+     if (cpu_is_at91sam9260() || cpu_is_at91sam9263())
+     mmc->caps |= MMC_CAP_4_BIT_DATA;
+     else
+     printk("AT91 MMC: 4 wire bus mode not supported"
+     " - using 1 wire ");
     }
 
     /*

使用特权

评论回复
23
arm86| | 2007-7-18 09:33 | 只看该作者

再次顶起

这比那些个广告商强多了。就等着你的板子了

使用特权

评论回复
24
arm86| | 2007-7-18 10:18 | 只看该作者

我以为没有图片呢

原来是有的,可惜给大版删掉了。何必呢,这跟广告不是一回事。这么多开放的代码,还能是广告吗?见过这么好的广告吗?

使用特权

评论回复
25
流星─派| | 2007-7-19 10:35 | 只看该作者

这是个广告,我喝楼主通过邮件的方式商量了购买的事项,

=================我答应要一块,==============
好, 我订一个吧,

在07-7-19,deeploves <deeploves@163.com> 写道: 
10* 135大小,

SD、 CF、 SPI、 IIC、TOUCH 、LCD 、LED 、NET 、GPRS 、USB、 UART、 AC97、 DATAFLASH、 NAND等等, 9263有什么接口就差不多有什么设备 

===================================然后他回复我=====================
  deeploves  致 我 
 显示详细信息  9:24 (1小时前)  

一块空板300块,6层板,下周二快递给你。

 

需要SDRAM和CPU及其它的器件吗?


==================我继续询问====================================

不是+器件350¥么?


在07-7-19,deeploves <deeploves@163.com> 写道: 
一块空板300 块,6 层板,下周二快递给你。 

 

需要SDRAM 和CPU 及其它的器件吗? 

 
=========================他回复====================================
日期  2007-7-19 上午10:23   
 主题  答复: 答复: 答复: 还要9263的板吗?   
 邮送域  163.com   

呵呵,不是
 


 
 


 

使用特权

评论回复
26
wangkj|  楼主 | 2007-7-19 11:09 | 只看该作者

你搞错了吧,这不是我回复的。

有人冒充!!!!!!!!!
极其愤怒!!!!!!!!!

俺只有9200和4510,4510有点问题,没继续。
9200的扩展版pcb还没回来!
我没说过350,是350左右,还没计算成本呢,正副不超过50元。

我打击的就是这帮把核心板当宝贝的奸商!当初我想买20片,愣是不降价,要800元一个!还不能独立运行!所以老王很生气,后果很严重,就做了这个更好的核心板。只是这个一个人的战斗,速度慢了点.请大家原谅!

300-400绝对不会比这个低,也不会比这个高。
当然,要把2G TF,外壳,320*240的lcd都加上,肯定我不干!

俺的QQ,MSN都公布了,老兄看看那个人的号码,肯定不是我的。!
amd.9966.org是我的网站。
deeploves@163.com这个人我不认识!我的msn:wangkj@yahoo.com,这也是我的邮件。用了8年多了。不过,不经常看。

使用特权

评论回复
27
wangkj|  楼主 | 2007-7-19 11:22 | 只看该作者

空版有5个,如果谁要,50元拿走

这假货不是空版350吗,俺50元就卖。只提供给北京的朋友,主要考虑没量产,
本地的朋友就算帮我测试了。要求会焊接的。零件没配齐,9200,8201等需要自己买

最讨厌这帮把垃圾当宝贝的假货。

不过,现在买的可能会亏,好像说量大的话,成本是10-20元。

我这个一次做了7片,是样品,不过,没有错误。焊接好就可以应该可以用。

另外,我焊接成功的这两片有1,2个飞线,是把元件焊接错了,吹下来几次,造成焊盘脱离。

所以,我拿不准是不是其他5片pcb的质量有保证!这也是我一直没有重新作pcb的原因。4层以上对pcb的工艺要求是两层绝对不能比的。

所以,愿意自己用我这5片pcb当小白鼠的,责任自负。就当帮我测试了。
以后,空pcb的价格绝对不超过50元。应该是35元左右。这个得看我找到的厂家给我的价格。原则是没有暴力,也不赔本。有钱大家赚,共同发展。共同富裕。

使用特权

评论回复
28
wangkj|  楼主 | 2007-7-19 11:25 | 只看该作者

bom list

想作一百套,愿意供货的给个价格。
可留言,email,qq,msn.短消息。
相关链接:https://bbs.21ic.com/upfiles/img/20077/2007719112420976.pdf

使用特权

评论回复
29
流星─派| | 2007-7-19 11:33 | 只看该作者

我前几天给你发了一个站内短信, 昨天你回给我了,

然后下午的时候收到第一封来自deeploves <deeploves@163.com>  的信, 我以为是你的. 然后就通过邮件联系.

如果是有人冒充的话, 我就很鄙视那个人. 同时向你道歉! 


因为我也是做硬件的, 对于成本还是有判断能力的. 我知道 350rmb 就是能够用来买器件和做板, 还要做板不能失误.

我还是向你预定一块这样的板子. 

我建议最好重开一个贴, 专门公布预订的人的ID啥的. 把板子的具体规格, 也写清楚, 免得其他的板友被骗.








 

使用特权

评论回复
30
wangkj|  楼主 | 2007-7-19 11:50 | 只看该作者

你的名字真有创意

不知道的还以为是总斑竹呢!!!!!!!!
我正在作apache+php+mysql,所有的事务都可以通过我自己用这个板子作的网站完成!

这套软件或许可能也许但不一定免费提供,因为里面有商业软件!
商业应用必须给作者费用的,不是我。

使用特权

评论回复
31
流星─派| | 2007-7-19 12:42 | 只看该作者

楼主的板子什么时候能搞好

我已经加你的MSN了.


====================我给那个骗子发的最后一封信=================
好吧

我已经把一些冥币存到你的账户, 反正*币你也不能用.
你把东西邮寄到这个地址:
阎王殿省关押骗子市地狱路18号地狱Building负18层.
================================================================

哈哈他看了不知道会不会生气...

使用特权

评论回复
32
linqing171| | 2007-7-19 20:33 | 只看该作者

流星[─]派 最近怪快活哦

可以随便转一下,呵呵
以前在 mop 经常见有人冒充斑竹,现在这里也时兴了.
hotp0wer
hotpovver
都被注册了,不会复了,赶紧注册去.嘿嘿.

使用特权

评论回复
33
921IC| | 2007-7-19 20:53 | 只看该作者

我也注册了一个,来回贴看看

像不?

使用特权

评论回复
34
lpf336| | 2007-7-24 11:28 | 只看该作者

这么好的东西 顶一下

使用特权

评论回复
35
wangkj|  楼主 | 2007-7-24 12:13 | 只看该作者

郁闷,俺的1G的TF卡被俺兄弟要走了

还得重新买新的!想买个4G的TF卡,结果,北京竟然找不到。
tabao有,不放心。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则