Changed INSN_CONFIG_PWM_OUTPUT so the rounding mode for the up and
authorFrank Mori Hess <fmhess@speakeasy.net>
Tue, 7 Mar 2006 02:37:01 +0000 (02:37 +0000)
committerFrank Mori Hess <fmhess@speakeasy.net>
Tue, 7 Mar 2006 02:37:01 +0000 (02:37 +0000)
down times can be set independently.

Documentation/comedi/insn_config
comedi/drivers/ni_mio_common.c

index 9a2b60e3f405eccb7967f597128a2fafdb7a70df..697051431b8fc22f4b0be7d1491fd4a0e4e0dffe 100644 (file)
@@ -187,6 +187,13 @@ ID=INSN_CONFIG_PWM_OUTPUT: Configure a pulse-width-modulation output.  Returns
        EAGAIN error with modified values if exact timing is not achievable.
 
        [0] - ID
-       [1] - flags (rounding mode for up/down times: TRIG_ROUND_NEAREST, etc.)
+       [1] - up time flags (rounding mode for time: TRIG_ROUND_NEAREST, etc.)
        [2] - up time (nanoseconds)
-       [3] - down time (nanoseconds)
+       [3] - down time flags (rounding mode for time: TRIG_ROUND_NEAREST, etc.)
+       [4] - down time (nanoseconds)
+
+ID=INSN_CONFIG_GET_PWM_OUTPUT: Query a pulse-width-modulation output.
+
+       [0] - ID
+       [1] - up time (nanoseconds)
+       [2] - down time (nanoseconds)
index ca276cacc4371e76824bae0749845255a29dd80b..cb92c71c217ee70683b996636c736dc95b8da4d3 100644 (file)
@@ -3352,29 +3352,41 @@ static int ni_m_series_pwm_config(comedi_device *dev, comedi_subdevice *s,
                {
                case TRIG_ROUND_NEAREST:
                        up_count = (data[2] + TIMER_BASE / 2) / TIMER_BASE; 
-                       down_count = (data[3] + TIMER_BASE / 2) / TIMER_BASE;
                        break;
                case TRIG_ROUND_DOWN:
                        up_count = data[2] / TIMER_BASE;
-                       down_count = data[3] / TIMER_BASE;
                        break;
                case TRIG_ROUND_UP:
                        up_count = (data[2] + TIMER_BASE - 1) / TIMER_BASE;
-                       down_count = (data[3] + TIMER_BASE - 1) / TIMER_BASE;
+                       break;
+               default:
+                       return -EINVAL;
+                       break;
+               }
+               switch(data[3])
+               {
+               case TRIG_ROUND_NEAREST:
+                       down_count = (data[4] + TIMER_BASE / 2) / TIMER_BASE;
+                       break;
+               case TRIG_ROUND_DOWN:
+                       down_count = data[4] / TIMER_BASE;
+                       break;
+               case TRIG_ROUND_UP:
+                       down_count = (data[4] + TIMER_BASE - 1) / TIMER_BASE;
                        break;
                default:
                        return -EINVAL;
                        break;
                }
                if(up_count * TIMER_BASE != data[2] ||
-                       down_count * TIMER_BASE != data[3])
+                       down_count * TIMER_BASE != data[4])
                {
                        data[2] = up_count * TIMER_BASE;
-                       data[3] = down_count * TIMER_BASE;
+                       data[4] = down_count * TIMER_BASE;
                        return -EAGAIN;
                }
                ni_writel(MSeries_Cal_PWM_High_Time_Bits(up_count) | MSeries_Cal_PWM_Low_Time_Bits(down_count), M_Offset_Cal_PWM);
-               return 4;
+               return 5;
                break;
        default:
                return -EINVAL;
@@ -3394,30 +3406,42 @@ static int ni_6143_pwm_config(comedi_device *dev, comedi_subdevice *s,
                {
                case TRIG_ROUND_NEAREST:
                        up_count = (data[2] + TIMER_BASE / 2) / TIMER_BASE; 
-                       down_count = (data[3] + TIMER_BASE / 2) / TIMER_BASE;
                        break;
                case TRIG_ROUND_DOWN:
                        up_count = data[2] / TIMER_BASE;
-                       down_count = data[3] / TIMER_BASE;
                        break;
                case TRIG_ROUND_UP:
                        up_count = (data[2] + TIMER_BASE - 1) / TIMER_BASE;
-                       down_count = (data[3] + TIMER_BASE - 1) / TIMER_BASE;
+                       break;
+               default:
+                       return -EINVAL;
+                       break;
+               }
+               switch(data[3])
+               {
+               case TRIG_ROUND_NEAREST:
+                       down_count = (data[4] + TIMER_BASE / 2) / TIMER_BASE;
+                       break;
+               case TRIG_ROUND_DOWN:
+                       down_count = data[4] / TIMER_BASE;
+                       break;
+               case TRIG_ROUND_UP:
+                       down_count = (data[4] + TIMER_BASE - 1) / TIMER_BASE;
                        break;
                default:
                        return -EINVAL;
                        break;
                }
                if(up_count * TIMER_BASE != data[2] ||
-                       down_count * TIMER_BASE != data[3])
+                       down_count * TIMER_BASE != data[4])
                {
                        data[2] = up_count * TIMER_BASE;
-                       data[3] = down_count * TIMER_BASE;
+                       data[4] = down_count * TIMER_BASE;
                        return -EAGAIN;
                }
                ni_writel(up_count, Calibration_HighTime_6143);
                ni_writel(down_count, Calibration_LowTime_6143);
-               return 4;
+               return 5;
                break;
        default:
                return -EINVAL;