I've added a section to the INTEGRATION_joint_spawn test to verify the SetParam("friction", ...) API, and I've also added a demo world: worlds/joint_friction_demo.world (note that it is generated from an embedded ruby template with suffic .rworld). In this world, there are several joints with different friction values that should behave differently. The universal joints are set to mimic the behavior of the revolute joints.
I should be able to get bullet to work in a similar manner. I will address this in a future pull request.
Caveats: the ODEJoint::SetVelocity had previously been using the ODE joint motors, so this function will currently interfere with joint friction. I plan to address this in a future pull request.
Apologies: I did some refactoring in the ODEJoint::[GS]etParam functions, which has made this diff a bit larger than it needed to be, but it allowed me to delete quite a bit of duplicate code.
I also moved the sdf parameter loading from ODEJoint::Load to the parent class.
I had to modify Joint::Reset to allow joint friction values to persist after a world reset (try resetting the demo world to verify that it works).
I had to add a small fix to the INTEGRATION_joint_spawn test to counteract the interference between SetVelocity and joint friction.