Revision: 84 http://acme-dev.svn.sourceforge.net/acme-dev/?rev=84&view=rev Author: claudyus Date: 2011-05-21 08:40:56 +0000 (Sat, 21 May 2011) Log Message: ----------- stepper-drv: make it to use struct for local vars Modified Paths: -------------- kernel-stuff/stepper-driver/stepper-nopwm.c Modified: kernel-stuff/stepper-driver/stepper-nopwm.c =================================================================== --- kernel-stuff/stepper-driver/stepper-nopwm.c 2011-05-21 08:40:41 UTC (rev 83) +++ kernel-stuff/stepper-driver/stepper-nopwm.c 2011-05-21 08:40:56 UTC (rev 84) @@ -36,9 +36,10 @@ /* module var*/ struct class *motor_class; +struct motor_device *motor; static dev_t motor_devno = 0; -static struct motor_device { +struct motor_device { unsigned long steps_max; unsigned long steps; @@ -48,12 +49,12 @@ int g_lpwr; int polarity; - struct hrtimer *t; + struct hrtimer hrt; + ktime_t interval; int status; - ktime_t interval; struct cdev *mcdev; -} motor[MAX_MOT_NUM]; +}; static unsigned int mot0[6] __initdata; static unsigned int mot1[6] __initdata; @@ -74,20 +75,33 @@ module_param_array(mot3, uint, &mot_nump[3], 0); MODULE_PARM_DESC(mot3, "mot3" BUS_PARM_DESC); -static int motor_pwm_set(struct motor_device *motp, unsigned long val) { - if (val == 0) - val =1; - motp->interval = ktime_set(0, val * 1000000UL); +struct motor_device * find_hrt (struct hrtimer *t) +{ + int i; + for ( i=0; i < MAX_MOT_NUM ; i++ ) { + if ( &(motor[i].hrt) == t) + return &(motor[i]); + } return 0; } -static enum hrtimer_restart gpio_timeout(struct hrtimer *htime) +struct motor_device * find_cdev (struct cdev *cdev) { - struct motor_device *mot = container_of(htime, struct motor_device, t); + int i; + for ( i=0; i < MAX_MOT_NUM ; i++ ) { + if ( motor[i].mcdev == cdev) + return &(motor[i]); + } + return 0; +} - printk(KERN_INFO "stepper: gpio_timeout %d\n",mot->status); +static enum hrtimer_restart gpio_timeout(struct hrtimer *t) +{ + struct motor_device *mot = find_hrt(t); + + if (mot->status) { gpio_set_value(mot->g_step ,0); mot->status = 0; @@ -97,13 +111,12 @@ mot->steps++; } - if (mot->steps >= mot->steps_max) { - hrtimer_try_to_cancel(&(mot->t)); - } else { - hrtimer_forward(mot->t, ktime_get(), mot->interval); + if (mot->steps < mot->steps_max) { + hrtimer_forward(&(mot->hrt), ktime_get(), mot->interval); return HRTIMER_RESTART; } + hrtimer_try_to_cancel(&(mot->hrt)); return HRTIMER_NORESTART; } @@ -114,8 +127,8 @@ unsigned long to_end; /* Ioctl was recently restructured http://lwn.net/Articles/119652/ */ - struct cdev *cdevp = file->f_dentry->d_inode->i_cdev; - struct motor_device *mot = container_of(cdevp, struct motor_device, mcdev); + struct cdev *cdev = file->f_dentry->d_inode->i_cdev; + struct motor_device *mot = find_cdev(cdev); printk(KERN_INFO "stepper: ioctl if: command %d args %ld \n", cmd, arg); @@ -134,17 +147,20 @@ gpio_set_value (mot->g_dir, 0); break; + case MOTOR_START: case MOTOR_PWM_ON: - hrtimer_start(mot->t, mot->interval, HRTIMER_MODE_REL); + hrtimer_start(&(mot->hrt), mot->interval, HRTIMER_MODE_REL); break; case MOTOR_PWM_OFF: - hrtimer_cancel(mot->t); + hrtimer_cancel(&(mot->hrt)); break; case MOTOR_PWM_SET: //set the pwm period in ms - motor_pwm_set (mot, arg); + if (arg == 0) //ensure a reliable value + arg =1; + mot->interval = ktime_set(0, arg * 1000UL); break; case MOTOR_RESET: @@ -155,10 +171,6 @@ mot->steps_max = arg; /* set the steps limit */ break; - case MOTOR_START: - hrtimer_start(&(mot->t), mot->interval, HRTIMER_MODE_REL); - break; - case MOTOR_LOWPWR: if ((int)arg) gpio_set_value (mot->g_lpwr, 1); @@ -205,16 +217,16 @@ goto err_para; } -// INIT_WORK(work[id], gpio_hr_work); - +// printk(KERN_INFO "request g_spte\n"); if (gpio_request(motor[id].g_step, "motor-step")) return -EINVAL; - hrtimer_init(motor[id].t, CLOCK_MONOTONIC, HRTIMER_MODE_REL); + hrtimer_init(&(motor[id].hrt), CLOCK_MONOTONIC, HRTIMER_MODE_REL); - motor[id].t->function = &gpio_timeout; - motor[id].interval = ktime_set(0, 10000000UL); + motor[id].hrt.function = &gpio_timeout; + motor[id].interval = ktime_set(0, 1000000UL); + if ( gpio_request(motor[id].g_enable, "motor-enable") < 0 ) { goto err_gpioenable; } @@ -241,6 +253,7 @@ /* create a new char device */ motor[id].mcdev = cdev_alloc(); + printk(KERN_INFO "stepper: cdev: %d\n", motor[id].mcdev); if(motor[id].mcdev == NULL) { status=-ENOMEM; goto err_dev; @@ -289,6 +302,8 @@ hrtimer_get_res(CLOCK_MONOTONIC, &tp); printk(KERN_INFO "Clock resolution is %ldns\n", tp.tv_nsec); + motor = kmalloc(sizeof(struct motor_device) * MAX_MOT_NUM, GFP_KERNEL ); + /*register the class */ motor_class = class_create(THIS_MODULE, "motor_class"); if(IS_ERR(motor_class)){ This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.