Linux uses two rings ring 0 is called kernel-level, ring 3 is called user-level. The connection from user to kernel is done (as it was already said) via syscalls. Between them are the libraries, as seen from the userland. So the most low level access to the kernel is implemented in libraries, for reasons of stability, security, synchronization, save spacing, and so on. The kernel-driver provides different interfaces to the userland: (ioctl, sysfs, sockets, character and block devices and so on) User Space Interfaces. So if you want, you can implement your access to the kernel driver by yourself omitting the libraries, or much easier compile your binary with static linked libraries.
A good starting point is to read the libusb sources, they are well documented.