And the cheap ones can be programmed, but you should be prepared to do it in C, dive into the datasheets, and perhaps write a kernel module or two if you have to, while working with an out-of-tree Linux kernel.