linux设备驱动中ADC的使用
2011-11-03 13:33
176 查看
内核源代码arch\arm\plat-s3c24xx\s3c2410-clock.c
/* standard clock definitions */
static struct clk init_clocks_off[] = {
{
.name = "nand",
.id = -1,
.parent = &clk_h,
.enable = s3c2410_clkcon_enable,
.ctrlbit = S3C2410_CLKCON_NAND,
}, {
.name = "sdi",
.id = -1,
.parent = &clk_p,
.enable = s3c2410_clkcon_enable,
.ctrlbit = S3C2410_CLKCON_SDI,
}, {
.name = "adc",
.id = -1,
.parent = &clk_p,
.enable = s3c2410_clkcon_enable,
.ctrlbit = S3C2410_CLKCON_ADC,
}, {
.name = "i2c",
.id = -1,
.parent = &clk_p,
.enable = s3c2410_clkcon_enable,
.ctrlbit = S3C2410_CLKCON_IIC,
}, {
.name = "iis",
.id = -1,
.parent = &clk_p,
.enable = s3c2410_clkcon_enable,
.ctrlbit = S3C2410_CLKCON_IIS,
}, {
.name = "spi",
.id = -1,
.parent = &clk_p,
.enable = s3c2410_clkcon_enable,
.ctrlbit = S3C2410_CLKCON_SPI,
}
};
static struct clk init_clocks[] = {
{
.name = "lcd",
.id = -1,
.parent = &clk_h,
.enable = s3c2410_clkcon_enable,
.ctrlbit = S3C2410_CLKCON_LCDC,
}, {
.name = "gpio",
.id = -1,
.parent = &clk_p,
.enable = s3c2410_clkcon_enable,
.ctrlbit = S3C2410_CLKCON_GPIO,
}, {
.name = "usb-host",
.id = -1,
.parent = &clk_h,
.enable = s3c2410_clkcon_enable,
.ctrlbit = S3C2410_CLKCON_USBH,
}, {
.name = "usb-device",
.id = -1,
.parent = &clk_h,
.enable = s3c2410_clkcon_enable,
.ctrlbit = S3C2410_CLKCON_USBD,
}, {
.name = "timers",
.id = -1,
.parent = &clk_p,
.enable = s3c2410_clkcon_enable,
.ctrlbit = S3C2410_CLKCON_PWMT,
}, {
.name = "uart",
.id = 0,
.parent = &clk_p,
.enable = s3c2410_clkcon_enable,
.ctrlbit = S3C2410_CLKCON_UART0,
}, {
.name = "uart",
.id = 1,
.parent = &clk_p,
.enable = s3c2410_clkcon_enable,
.ctrlbit = S3C2410_CLKCON_UART1,
}, {
.name = "uart",
.id = 2,
.parent = &clk_p,
.enable = s3c2410_clkcon_enable,
.ctrlbit = S3C2410_CLKCON_UART2,
}, {
.name = "rtc",
.id = -1,
.parent = &clk_p,
.enable = s3c2410_clkcon_enable,
.ctrlbit = S3C2410_CLKCON_RTC,
}, {
.name = "watchdog",
.id = -1,
.parent = &clk_p,
.ctrlbit = 0,
}, {
.name = "usb-bus-host",
.id = -1,
.parent = &clk_usb_bus,
}, {
.name = "usb-bus-gadget",
.id = -1,
.parent = &clk_usb_bus,
},
};
从这里我们可以看到系统启动时,那些时钟使能了,那些被禁止了,所以我们的ADC时钟在系统启动后是不能使用的。
要使用ADC时钟首先我们需要获得ADC时钟,然后使能它。
获得时钟函数
struct clk *clk_get(struct device *dev, const char *id)
第一个参数中,因为clk->id一般为-1,所以直接传入NULL就可以了。
如果clk->id不为-1,函数会通过第一个参数传入的dev获取dev->bus_id。
第二个参数是一个字符串,用来指定你要获取的时钟的名字。参数传入后,内核查找到一个dev->id(或者-1)是否与clk->id一致,并且con_id与clk->name一致的时钟,如果不一致就会获取失败。所以,我这里的函数应该是:clk_get(NULL,
“adc”)。
使能时钟函数
int clk_enable(struct clk *clk)
禁止时钟函数
void clk_disable(struct clk *clk)
之后我们就可以使用ADC了。
/* standard clock definitions */
static struct clk init_clocks_off[] = {
{
.name = "nand",
.id = -1,
.parent = &clk_h,
.enable = s3c2410_clkcon_enable,
.ctrlbit = S3C2410_CLKCON_NAND,
}, {
.name = "sdi",
.id = -1,
.parent = &clk_p,
.enable = s3c2410_clkcon_enable,
.ctrlbit = S3C2410_CLKCON_SDI,
}, {
.name = "adc",
.id = -1,
.parent = &clk_p,
.enable = s3c2410_clkcon_enable,
.ctrlbit = S3C2410_CLKCON_ADC,
}, {
.name = "i2c",
.id = -1,
.parent = &clk_p,
.enable = s3c2410_clkcon_enable,
.ctrlbit = S3C2410_CLKCON_IIC,
}, {
.name = "iis",
.id = -1,
.parent = &clk_p,
.enable = s3c2410_clkcon_enable,
.ctrlbit = S3C2410_CLKCON_IIS,
}, {
.name = "spi",
.id = -1,
.parent = &clk_p,
.enable = s3c2410_clkcon_enable,
.ctrlbit = S3C2410_CLKCON_SPI,
}
};
static struct clk init_clocks[] = {
{
.name = "lcd",
.id = -1,
.parent = &clk_h,
.enable = s3c2410_clkcon_enable,
.ctrlbit = S3C2410_CLKCON_LCDC,
}, {
.name = "gpio",
.id = -1,
.parent = &clk_p,
.enable = s3c2410_clkcon_enable,
.ctrlbit = S3C2410_CLKCON_GPIO,
}, {
.name = "usb-host",
.id = -1,
.parent = &clk_h,
.enable = s3c2410_clkcon_enable,
.ctrlbit = S3C2410_CLKCON_USBH,
}, {
.name = "usb-device",
.id = -1,
.parent = &clk_h,
.enable = s3c2410_clkcon_enable,
.ctrlbit = S3C2410_CLKCON_USBD,
}, {
.name = "timers",
.id = -1,
.parent = &clk_p,
.enable = s3c2410_clkcon_enable,
.ctrlbit = S3C2410_CLKCON_PWMT,
}, {
.name = "uart",
.id = 0,
.parent = &clk_p,
.enable = s3c2410_clkcon_enable,
.ctrlbit = S3C2410_CLKCON_UART0,
}, {
.name = "uart",
.id = 1,
.parent = &clk_p,
.enable = s3c2410_clkcon_enable,
.ctrlbit = S3C2410_CLKCON_UART1,
}, {
.name = "uart",
.id = 2,
.parent = &clk_p,
.enable = s3c2410_clkcon_enable,
.ctrlbit = S3C2410_CLKCON_UART2,
}, {
.name = "rtc",
.id = -1,
.parent = &clk_p,
.enable = s3c2410_clkcon_enable,
.ctrlbit = S3C2410_CLKCON_RTC,
}, {
.name = "watchdog",
.id = -1,
.parent = &clk_p,
.ctrlbit = 0,
}, {
.name = "usb-bus-host",
.id = -1,
.parent = &clk_usb_bus,
}, {
.name = "usb-bus-gadget",
.id = -1,
.parent = &clk_usb_bus,
},
};
从这里我们可以看到系统启动时,那些时钟使能了,那些被禁止了,所以我们的ADC时钟在系统启动后是不能使用的。
要使用ADC时钟首先我们需要获得ADC时钟,然后使能它。
获得时钟函数
struct clk *clk_get(struct device *dev, const char *id)
第一个参数中,因为clk->id一般为-1,所以直接传入NULL就可以了。
如果clk->id不为-1,函数会通过第一个参数传入的dev获取dev->bus_id。
第二个参数是一个字符串,用来指定你要获取的时钟的名字。参数传入后,内核查找到一个dev->id(或者-1)是否与clk->id一致,并且con_id与clk->name一致的时钟,如果不一致就会获取失败。所以,我这里的函数应该是:clk_get(NULL,
“adc”)。
使能时钟函数
int clk_enable(struct clk *clk)
禁止时钟函数
void clk_disable(struct clk *clk)
之后我们就可以使用ADC了。
相关文章推荐
- linux设备驱动归纳总结(十三):1.触摸屏与ADC时钟
- 【stm32】ADC的规则通道和注入通道混合使用
- Linux设备驱动工程师之路——内核链表的使用
- 电路设计_STM8S003F3P6 AWU&ADC使用小结
- 使用Beaglebone Black的ADC
- ADC采样芯片ADS7822使用方法
- LINUX设备驱动之触摸屏tslib编译使用方法
- [Micropython TPYBoard ] ADC的使用方法
- linux设备驱动第三版的使用问题
- STM32L152 ADC使用总结
- STM32F373的SDADC在STM32CubeMx中使用DMA配置
- linux设备驱动归纳总结(十三):1.触摸屏与ADC时钟
- STM32L073 使用cube生成ADC多路采样错误解决
- STM32F103RC单片机ADC中的间断模式(Discontinous mode)的使用
- Linux设备驱动工程师之路——内核链表的使用
- STM32中ADC的使用/printf函数重定向串口显示内部温度传感器测量值
- linux设备驱动归纳总结(十三):1.触摸屏与ADC时钟【转】
- 使用28377S进行ADC采样时配置错误导致波形畸变问题
- linux设备驱动编程环境的搭建小结(结合LDD3使用)
- STM32f103的数电采集电路的双ADC的设计与使用