<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />
一、USB的“JoyStickMouse”移植准备
1、移植目的
(1)功能
能够在智林开发板上实现鼠标的模拟,利用超级终端来的控制字符,控制鼠标的移动。“a”左移,“d”右移,“w”上移,“x”下移,“s”代码左键,“空格”代表右键来控制PC上的鼠标。“ESC”键退出USB鼠标模拟,断开USB设备。
(2)命令实现
上述功能由串口终端命令控制,umouse。
2、硬件准备
开发板上“PA11”和“PA12”脚复用为USB的“DP、DM”引脚,PD2用于连接控制,所以先要初始化这三个引脚。
先实现USP_LP中断,先不考虑挂起和唤醒。
3、添加命令umouse
其方法在前面的文章中已经做过几次陈叙,这里就不多言了。
命令添加成功,下载运行,显示命令处理的测试字符串,表示命令添加成功。
二、主要函数的修改
1、工程里添加USB库文件,逐个编译通过
(1)在工程目录下新建一个文件夹,名为USB。再新建两个子目录,名为usblib和mouse。
将底层操作文件usbregs.c、usbmem.c、usbinit.c、usbint.c和usbcore.c等5个c源文件和相应的头文件复制到usblib里面。
将实现Mouse功能的上层文件hw_config.c、usb_desc.c、usb_prop.c、usb_pwr.c和usb_istr.c等5个文件,以及相应的头文件都复制到mouse文件夹。
(2)在uv3工程里添加项目组usblib和mouse,添加对应的源文件。
(3)逐个编译,这里主要是解决每个c源文件的语法问题,和引用外部定义的声明问题。
因为库文件语法上肯定是没有问题的,主要是脱离原有例程,在新的工程文件中解决头文件包含的问题。
比如一个c文件里用了 u8、u16这样的数据类型,则在它所包含的头文件中,必须已经做过这个类型的声明。
(4)整体工程编译,这里主要是解决每个源文件引用的函数声明是不是正确的实现了。
比如a.c文件里使用了 int func1(char *)这样的函数,它在包含的头文件中声明了。单独编译时不会出错,但是如果这个函数没有由其它源文件实现,则在整体编译时就会出错。
以上做的目的,是先保证整个工程语法、结构上的正确和完整性,接下来的与开发板相关的移植工作在这个框架下进行就可以了。
2、首先修改hw_config.c,建立适合自己开发板的硬件初始化和操作函数。
(1)端口配置USB_Connect_Init()
我的开发板上只用一个PD2来控制USB设备的连接于断开,所以不能用Set_System(void)函数了,名字太大了,改为USB_Connect_Init(),表明初始化连接线。
改变函数名称以后,头文件和引用的地方都要修改。
(2)中断设置USB_Interrupts_Config()
只设置一个中断,唤醒中断和外部中断都去掉。
(3)配置时钟Set_USBClock()
这个不用改变。
(4)USB_Cable_Config函数的修改
GPIO_ResetBits(GPIOD, GPIO_PIN_2)直接采用端口名,而不使用原例程中名称。
(5)JoyState函数先清空,具体功能后面再实现。Joystick_Send(u8 Keys)函数保持原样。
u8 JoyState(void)
{
return 0;
}
(5)hw_config.h中不需要的函数注释掉
void USB_Connect_Init(void);
void Set_USBClock(void);
//void Enter_LowPowerMode(void);
//void Leave_LowPowerMode(void);
void USB_Interrupts_Config(void);
void USB_Cable_Config (FunctionalState NewState);
void Joystick_Send(u8 Keys);
u8 JoyState(void);
//void Get_SerialNum(void);
保留了六个函数。
(6)单独编译该文件,通过。
在这个过程中,重新加深了注释掉代码方法的认识。、
因为原有代码如果直接删掉,不太合适,以后可能要用到。用/* */不好使,因为它内部原本就有很多这样的注释。用// 太麻烦,几乎得一条条注释。
使用以下方法,可以注释掉代码。
#if 0
暂时不用的代码
#endif
3、修改usb_pwr.c
(1)不使用的函数注释掉,主要是suspend()函数和resume()函数。
(2)头文件中不用的声明函数注释掉
//void Suspend(void);
//void Resume_Init(void);
//void Resume(RESUME_STATE eResumeSetVal);
RESULT PowerOn(void);
RESULT PowerOff(void);
单独编译,通过。
4、修改usb_prop.c
这个函数就修改了一处:
// Get_SerialNum(); 把这个函数注释掉了,然后头文件中的声明去掉,原有的定义注释掉。
5、修改usb_istr.c
主要是在“usb_conf.h”修改中断屏蔽向量定义,去掉挂起、唤醒、ESOF三种中断。
6、usb_desc.c不用修改
7、底层函数不用修改
三、下载测试
void UartCmdUsbMouse(u8 argc,void **argv)
{
Uart_PutString ( "进入USB鼠标实现过程!\r\n" );
USB_Connect_Init();
USB_Interrupts_Config();
Set_USBClock();
USB_Init();
while (1)
{
Delay(10);
if (bDeviceState == CONFIGURED)
{
Joystick_Send(1);
}
}
}
我把主函数改成以上的样子,整体编译通过,下载测试,主机发现了新设备。结果鼠标就不受控制了,一直往窗口底下钻。
因为我把它改成始终在发“1”,它的含义是什么呢?到函数中看一看:
void Joystick_Send(u8 Keys)
{
u8 Mouse_Buffer[4] = {0, 0, 0, 0};
s8 X = 0, Y = 0;
switch (Keys)
{
case LEFT: 它是2
X -= CURSOR_STEP;
break;
case RIGHT: 它是3
X += CURSOR_STEP;
break;
case UP: 它是4
Y -= CURSOR_STEP;
break;
case DOWN: //原来根据定义Down为1,难怪了。
Y += CURSOR_STEP;
break;
default:
return;
}
UserToPMABufferCopy(Mouse_Buffer, GetEPTxAddr(ENDP1), 4);
/* enable endpoint for transmission */
SetEPTxValid(ENDP1);
}
“4”为UP,“3”为RIGHT,“2”为LEFT,也就是如果我改为“2”,鼠标会一直向左顶格,试一试。
果然是这样。可以说,我的移植已经初步成功了。因为时间比较晚了,明天再完善一下控制的过程吧。
tengjingshu_112148725 2010-4-20 00:21