原创 USB的“JoyStickMouse”例程移植过程分析01

2010-4-19 22:04 6095 12 13 分类: MCU/ 嵌入式

<?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的“DPDM”引脚,PD2用于连接控制,所以先要初始化这三个引脚。


先实现USP_LP中断,先不考虑挂起和唤醒。


3、添加命令umouse


其方法在前面的文章中已经做过几次陈叙,这里就不多言了。


命令添加成功,下载运行,显示命令处理的测试字符串,表示命令添加成功。


 


二、主要函数的修改


1、工程里添加USB库文件,逐个编译通过


1)在工程目录下新建一个文件夹,名为USB。再新建两个子目录,名为usblibmouse


将底层操作文件usbregs.cusbmem.cusbinit.cusbint.cusbcore.c5c源文件和相应的头文件复制到usblib里面。


将实现Mouse功能的上层文件hw_config.cusb_desc.cusb_prop.cusb_pwr.cusb_istr.c5个文件,以及相应的头文件都复制到mouse文件夹。


 


2)在uv3工程里添加项目组usblibmouse,添加对应的源文件。


 


3)逐个编译,这里主要是解决每个c源文件的语法问题,和引用外部定义的声明问题。


因为库文件语法上肯定是没有问题的,主要是脱离原有例程,在新的工程文件中解决头文件包含的问题。


比如一个c文件里用了 u8u16这样的数据类型,则在它所包含的头文件中,必须已经做过这个类型的声明。


 


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()


这个不用改变。


 


4USB_Cable_Config函数的修改


GPIO_ResetBits(GPIOD, GPIO_PIN_2)直接采用端口名,而不使用原例程中名称。


 


5JoyState函数先清空,具体功能后面再实现。Joystick_Send(u8 Keys)函数保持原样。


u8 JoyState(void)


{


    return 0;


}


 


5hw_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三种中断。


 


6usb_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:  //原来根据定义Down1,难怪了。


      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”,鼠标会一直向左顶格,试一试。


果然是这样。可以说,我的移植已经初步成功了。因为时间比较晚了,明天再完善一下控制的过程吧。


 


 

文章评论1条评论)

登录后参与讨论

tengjingshu_112148725 2010-4-20 00:21

占座
相关推荐阅读
nthq2004 2010-05-08 20:04
USB自定义设备驱动02
<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />  本来还想编写应用程序测试一下自定...
nthq2004 2010-05-07 21:35
USB自定义设备驱动01
<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />  一、USB设备驱动入门1、学习目...
nthq2004 2010-05-04 21:01
智林开发板上实现自定义的USB HID设备
<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />  一、自定义HID设备的相关概念1...
nthq2004 2010-05-01 21:58
U盘例程在智林开发板上的移植
 <?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /> 一、移植前的准备工作1、有哪些操...
nthq2004 2010-04-30 19:19
U盘实现流程跟踪分析02
<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />   二、追踪USB大容量设备的实现...
nthq2004 2010-04-27 21:51
U盘实现流程跟踪分析01
<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />   一、追踪USB大容量设备的实现...
我要评论
1
12
关闭 站长推荐上一条 /2 下一条