No puedes tener en tu código dos rutinas con el mismo nombre.Por lo que deberás moverlas,no copiarlas.
Que yo recuerde, las modificaciones que hizo J1M consistían únicamente en los descriptores de dispositivo. Dependiendo del tipo de dispositivo que vayas a implementar (CDC,MSD,AUDIO,HID,etc..) y de otras cuestiones como el tema de endpoints, dichos descriptores deben tener una estructura y contenido concretos.
Del lado del host, no recuerdo el modo de gestionar los endpoints, pero por lógica, también se deberían poder gestionar de forma independiente, es decir, recibir y/o enviar cada vez por un endpoint concreto.
Esto de los endpoints, mirándolo del lado del pic, imagínalos como si se tratara de usarts. Cada endpoint es una usart...con sus registros de control (descriptores de buffer), sus registros de dato (buffers),etc...la diferencia radicaría en que todos los endpoints lanzan una misma rutina de interrupción, y de la forma que yo implementé el tema, el endpoint responsable de la interrupción estará indicado por el parámetro "en" de la rutina "datos_endpoint(en)", por lo que sabrás a donde tienes que ir a buscar los datos que te han llegado cuando dicha interrupción se produzca.
Si sólo vas a usar un endpoint, pues dicho parámetro te es supérfluo.