gpiosetbyte(); Quoting gabrielepinca <[EMAIL PROTECTED]>:
> Dear John, > the solution you gave in the previous post, gives an intermediate > wrong output value. This cause errors if we dont'have an enable bit. > For example for program an RF parrallel attenuator... > http://www.hittite.com/product_info/product_specs/attenuators/hmc472lp4.pdf > I think that the following code can solve the problem in the correct > way, but i dont know how to add this as driver. > I have no idea on how to compile the "gpio_syscalls.c" and make the > function work. > Any help? how can i call this function? > Thanks > Gabriele > > asmlinkage void sys_gpiosetbyte(unsigned char port, unsigned int bits, > int value){ > switch(port){ > case 'G': > case 'g': > if((bits & 0x0000FF00)==0x0000FF00){ > port_g_data_shadow &= ~bits; > value = (value << 8); > *R_PORT_G_DATA = port_g_data_shadow |= value; > }; > if((bits & 0x00FF0000)==0x00FF0000){ > port_g_data_shadow &= ~bits; > value = (value << 16); > *R_PORT_G_DATA = port_g_data_shadow |= value; > }; > break; > > case 'A': > case 'a': > > case 'B': > case 'b': > break; > } > } > > > > --- In [email protected], John Crispin <[EMAIL PROTECTED]> wrote: >> >> gpiosetbits(PORTG, (value << 8) & 0xff00); >> gpioclearbits(PORTG, (~value << 8) & 0xff00); >> >> should do the job then >> >> >> >> Quoting f_lamme <[EMAIL PROTECTED]>: >> >> > But this way I move all the 32 bits. >> > I need to move only these 8 >> > PG8-PG15 >> > >> > --- In [email protected], John Crispin <john@> wrote: >> >> >> >> hi >> >> >> >> gpiosetbits(PORTG, (value << 8) & 0xffffff00); >> >> gpioclearbits(PORTG, (~value << 8) & 0xffffff00); >> >> >> >> >> >> although the & 0xffffff00 bit is not really needed, it is just for >> > sanity >> >> >> >> john >> >> >> >> > if (value&0x01) >> >> > gpiosetbits(PORTG, PG8); >> >> > else >> >> > gpioclearbits(PORTG, PG8); >> >> > if (value&0x02) >> >> > gpiosetbits(PORTG, PG9); >> >> > else >> >> > gpioclearbits(PORTG, PG9); >> >> > if (value&0x04) >> >> > gpiosetbits(PORTG, PG10); >> >> > else >> >> > gpioclearbits(PORTG, PG10); >> >> > if (value&0x08) >> >> > gpiosetbits(PORTG, PG11); >> >> > else >> >> > gpioclearbits(PORTG, PG11); >> >> > if (value&0x10) >> >> > gpiosetbits(PORTG, PG12); >> >> > else >> >> > gpioclearbits(PORTG, PG12); >> >> > if (value&0x20) >> >> > gpiosetbits(PORTG, PG13); >> >> > else >> >> > gpioclearbits(PORTG, PG13); >> >> > if (value&0x40) >> >> > gpiosetbits(PORTG, PG14); >> >> > else >> >> > gpioclearbits(PORTG, PG14); >> >> > if (value&0x80) >> >> > gpiosetbits(PORTG, PG15); >> >> > else >> >> > gpioclearbits(PORTG, PG15); >> >> > // cs e clk >> >> > gpioclearbits(PORTG, PG1); >> >> > gpiosetbits(PORTG, PG3); >> >> > gpioclearbits(PORTG, PG3); >> >> > if (clk==1) >> >> > { >> >> > gpiosetbits(PORTG, PG3); >> >> > gpioclearbits(PORTG, PG3); >> >> > } >> >> > gpiosetbits(PORTG, PG1); >> >> > >> >> > } >> >> > the problem and the slowness with which the byte is sent > because the >> >> > byte is sent bit per bit. >> >> > Does a way exist to send a whole byte? >> >> > I excuse but I do not speak English very well >> >> > >> >> > >> >> >> > >> > >> > >> > > >
