免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 4082 | 回复: 9
打印 上一主题 下一主题

[USB-HOST]飞利浦ISP1160芯片移植心得 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-06-02 18:34 |只看该作者 |倒序浏览
ISP1160这颗芯片Linux中自带驱动(虽然不支持等时传输),是市场上使用比较成熟的一颗芯片。

由于已经有移植S1R72V17的经验,很快就搞定了ISP1160的驱动移植。

移植过程(基于SEP4020+Linux2.6.16)
1)在make menuconfig中选上1160驱动
│ ---   USB Host Controller Drivers
│ │ <*>   ISP116X HCD support
│ │ < >   SL811HS HCD support
│ │ < >   S1R72V05 HCD support
│ │ < >   S1R72V17 HCD support  

2)修改linux/arch/arm/mach-sep4020/devices.c文件,在最后添加如下代码:

/* --------------------------------------------------------------------
* ISP1160
* -------------------------------------------------------------------- */
/* I use bank nCSD and EINT5 for isp116x */
#define USB_IO_PHYS 0x2c000000
/* Platform delay */
void isp116x_pfm_delay(struct device *dev, int delay)
{
/* On this platform, we work with 200MHz clock, giving
5 ns per instruction. The cycle below involves 2
instructions and we lose 2 more instruction times due
to pipeline flush at jump. I.e., we consume 20 ns
per cycle.
*/
int cyc = delay / 20;
__asm__ volatile ("0:\n"
"     subs %0, %1, #1\n"
"     bge   0b\n"
:"=r" (cyc)
:"0"(cyc)
);
}

/* Define chip configuration */
struct isp116x_platform_data isp116x_pfm_data =
{
.sel15Kres = 1,
.remote_wakeup_enable = 1,
.delay = isp116x_pfm_delay,
};

/* Define chip address and IRQ line */
struct resource isp116x_pfm_resources[] =
{
[0] = {   /// data (A0 = 0)
   .start = USB_IO_PHYS,
   .end = USB_IO_PHYS + 1,
   .flags = IORESOURCE_MEM,
},
[1] = {   /// addr (A0 = 1)
   .start = USB_IO_PHYS + 2,
   .end = USB_IO_PHYS + 3,
   .flags = IORESOURCE_MEM,
},
[2] = {
   .start = INTSRC_EXTINT5, //
   .end = INTSRC_EXTINT5,
   .flags = IORESOURCE_IRQ,
},
};

struct platform_device isp116x_pfm_usbhost_device =
{
.name = "isp116x-hcd",
.num_resources = ARRAY_SIZE(isp116x_pfm_resources),
.resource = isp116x_pfm_resources,
.dev.platform_data = &isp116x_pfm_data,
};
//end of isp1160

稍作解释:基地址nCSD=0x2c000000,外部中断使用INTSRC_EXTINT5

3)修改linux/arch/arm/mach-sep4020/4020.c文件,在适当位置添加如下代码:
extern struct platform_device isp116x_pfm_usbhost_device;


static struct platform_device *devices[] __initdata = {
&serial_device,
&sep4020_device_rtc,
&epson_ohci_device,
&isp116x_pfm_usbhost_device,   //isp1160只要这句即可
      &sep4020_device_usbgadget

};

4)重新编译,启动时看如如下信息,说明芯片没问题:
116x: driver isp116x-hcd, 03 Nov 2005
isp116x-hcd isp116x-hcd.0: ISP116x Host Controller
isp116x-hcd isp116x-hcd.0: new USB bus registered, assigned bus number 1
isp116x-hcd isp116x-hcd.0: irq 6, io base 0x2c000002
enable_irq(6) unbalanced from c017ca5c
usb usb1: Product: ISP116x Host Controller
usb usb1: Manufacturer: Linux 2.6.16 isp116x-hcd
usb usb1: SerialNumber: isp116x-hcd.0
usb usb1: configuration #1 chosen from 1 choice
hub 1-0:1.0: USB hub found
hub 1-0:1.0: 2 ports detected
Initializing USB Mass Storage driver...
usbcore: registered new driver usb-storage
USB Mass Storage support registered.
usbcore: registered new driver usbhid
drivers/usb/input/hid-core.c: v2.6:USB HID core driver

5)修改/4020/linux/drivers/usb/host/isp116x-hcd.c文件:
在1417行添加如下代码,注意中断触发是下降沿,与S1R72V17不同:
//init extinit5
*(volatile unsigned long*)GPIO_PORTA_SEL_V |= 1 << 5 ;       //for common use
        *(volatile unsigned long*)GPIO_PORTA_DIR_V |= 1 << 5 ;       //1 stands for in
        *(volatile unsigned long*)GPIO_PORTA_INTRCTL_V |= (0x1<<10) ;//中断类型为下降沿解发
        *(volatile unsigned long*)GPIO_PORTA_INCTL_V |= 1 << 5 ;     //中断输入方式
        *(volatile unsigned long*)GPIO_PORTA_INTRCLR_V |= 1 << 5 ;    //清除中断
        *(volatile unsigned long*)GPIO_PORTA_INTRCLR_V = 0x0000;     //清除中断
enable_irq(INTSRC_EXTINT5);

6)在600行加入关闭及清除中断代码:
disable_irq(INTSRC_EXTINT5);
*(volatile unsigned long*)GPIO_PORTA_INTRCLR_V |= 1 << 5 ;    //清除中断
      *(volatile unsigned long*)GPIO_PORTA_INTRCLR_V = 0x0000;     //清除中断

7)在650行中断结束时打开:
enable_irq(INTSRC_EXTINT5);

重新编译后,可正常工作,并且两个Host接口都可以工作。


1)测试U盘
/ #
/ #
/ # usb 1-2: new full speed USB device using isp116x-hcd and address 2
usb 1-2: Product: Cruzer Micro
usb 1-2: Manufacturer: SanDisk
usb 1-2: SerialNumber: 3514011B77C2EB4F
usb 1-2: configuration #1 chosen from 1 choice
ub(1.2): GetMaxLUN returned 0, using 1 LUNs
uba: uba1

2)测试RT73无线网卡
rtusb init ====>
usbcore: registered new driver rt73


usb 1-2: Product: 802.11 bg WLAN
usb 1-2: Manufacturer: Ralink
usb 1-2: configuration #1 chosen from 1 choice
idVendor = 0xb05, idProduct = 0x1723


/ # ifconfig rausb0 192.168.100.200
rt73 driver version - 1.0.4.0
/ # ping 192.168.100.1
PING 192.168.100.1 (192.168.100.1): 56 data bytes
64 bytes from 192.168.100.1: seq=6 ttl=64 time=2040.237 ms
64 bytes from 192.168.100.1: seq=7 ttl=64 time=1031.063 ms
64 bytes from 192.168.100.1: seq=8 ttl=64 time=32.088 ms
64 bytes from 192.168.100.1: seq=9 ttl=64 time=11.253 ms
64 bytes from 192.168.100.1: seq=10 ttl=64 time=3.359 ms
64 bytes from 192.168.100.1: seq=11 ttl=64 time=11.180 ms
6
64 bytes from 192.168.100.1: seq=12 ttl=64 time=10.185 ms

--- 192.168.100.1 ping statistics ---
13 packets transmitted, 7 packets received, 46% packet loss
round-trip min/avg/max = 3.359/448.480/2040.237 ms

评分

参与人数 1可用积分 +15 收起 理由
bitmilong + 15 精品文章

查看全部评分

论坛徽章:
0
2 [报告]
发表于 2009-06-04 13:18 |只看该作者
顶一个!

论坛徽章:
0
3 [报告]
发表于 2009-06-04 15:51 |只看该作者
不错,学习下

在中断里面需要手动开关中断吗? 内核里面应该有处理吧?

论坛徽章:
0
4 [报告]
发表于 2009-06-04 16:08 |只看该作者
偶見分享經驗的,支持下.

论坛徽章:
0
5 [报告]
发表于 2009-06-04 20:28 |只看该作者
原帖由 star316 于 2009-6-4 15:51 发表
不错,学习下

在中断里面需要手动开关中断吗? 内核里面应该有处理吧?

应该不需要手动。

论坛徽章:
0
6 [报告]
发表于 2009-06-04 22:11 |只看该作者
那LZ 的 开关中断的代码修改部分应该就不需要修改了, 可惜没有这个芯片,要不可以实验下

论坛徽章:
0
7 [报告]
发表于 2009-06-05 09:41 |只看该作者
我看默认代码是用spin_lock而不是spin_lock_irq

所以怀疑没有关中断

论坛徽章:
0
8 [报告]
发表于 2009-06-05 10:09 |只看该作者
有没有试过去掉那段开关中断代码,测试有问题吗?ret = usb_add_hcd(hcd, irq, IRQF_DISABLED); 这一段不是在关闭中断时候处理ISR么

[ 本帖最后由 star316 于 2009-6-5 10:21 编辑 ]

论坛徽章:
0
9 [报告]
发表于 2009-06-05 17:38 |只看该作者
原帖由 star316 于 2009-6-5 10:09 发表
有没有试过去掉那段开关中断代码,测试有问题吗?ret = usb_add_hcd(hcd, irq, IRQF_DISABLED); 这一段不是在关闭中断时候处理ISR么

请问你是用的什么代码呢?我的2.6.16里面是


        ret = usb_add_hcd(hcd, irq, SA_INTERRUPT);
        if (ret)
                goto err6;

这个


还有问下大家我测试无线网卡时感觉系统比较迟钝

用示波器量了一下ISP1160的中断信号,2ms一次,每秒有500次中断,正常吗?

论坛徽章:
0
10 [报告]
发表于 2009-06-05 17:42 |只看该作者
原帖由 star316 于 2009-6-5 10:09 发表
有没有试过去掉那段开关中断代码,测试有问题吗?ret = usb_add_hcd(hcd, irq, IRQF_DISABLED); 这一段不是在关闭中断时候处理ISR么

看来是我用的内核太老了,看了2.6.26内核的确是这样的

不知道能不能搬过来
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP