📄 tda7540.c
字号:
#include "tda7540.h"static int am_fm_tuner_major = AM_FM_TUNER_MAJOR;static struct cdev am_fm_tuner_cdev;/*global variable for device*/u8 defReg[]={ 0xd9,0x0,0x0,0x0,0x0,0x9f,0x8f,0x0,0x60,0xf8, //Reg0-9 0x08,0x40,0xf3,0xaf,0x25,0x80,0xf8,0xc0,0x26,0xd9, //Reg10-19 0x00,0x07,0x04,0x7e,0x46,0xbe,0xe7,0x7f,0x6c,0xdc, //Reg20-29 0x25,0xdd,0x04,0x00,0x00,0x00,0x00,0x00,0xfe,0xfe}; static u8 tv1_65,tv1_76,tv1_87;static u8 tv2_65,tv2_76,tv2_87;static u8 iq_65,iq_76,iq_87;static u8 curband,ifc1;static u8 tunermod; static void initTuner(){ u8 addr = 0x0; for(addr = 0; addr < 40;addr++) { i2c_write(addr,defReg[addr]); } tv1_65=0; tv2_65=0; tv1_76=0; tv2_76=0; tv1_87=0; tv2_87=0; iq_65=7; iq_76=7; iq_87=7; curband=FM_EU_BAND; ifc1=IFC1; WriteTda7540Reg(XTALREG,i2c_read(XTALREG)); WriteTda7540Reg(LEVELREG,i2c_read(LEVELREG)); WriteTda7540Reg(IFC2REG,0x8f); //0x8f 12.5K 0x6f 6.25k WriteTda7540Reg(SCTRLREG,FMSCTRL); WriteTda7540Reg(IQREG,iq_87); WriteTda7540Reg(PLLREFREG,0x0+0x20+0x4+0x01); IFCOnOff(1); }static void IFCOnOff(u8 onoff){ if(onoff) ifc1|=0x08; else ifc1&=~0x08; WriteTda7540Reg(IFC1REG,ifc1);}static void setFreq(u32 freq){ u8 nl,nh; u8 tv1_data,tv2_data,reff,minf; char tvstep; u16 temp; freq+=10700; switch(FM_EU_BAND){ case FM_EU_BAND: minf=87; tvstep=0; tv1_data=tv1_87; tv2_data=tv2_87; reff=50; break; case FM_JP_BAND: freq-=21400; minf=76; tvstep=-3; tv1_data=tv1_76; tv2_data=tv2_76; reff=25; break; case FM_OT_BAND: minf=65; tvstep=3; tv1_data=tv1_65; tv2_data=tv2_65; reff=10; break; case AM_MW_BAND: minf=0; tvstep=0; tv1_data=0; tv2_data=0; reff=1; break; } temp=freq/reff; temp-=32; nl=temp; nh=temp>>8; WriteTda7540Reg(1,nl); WriteTda7540Reg(2,nh); freq/=1000; temp=freq-minf; tvstep*=temp; tv1_data+=tvstep; tv2_data+=tvstep; WriteTda7540Reg(TV1REG,tv1_data); WriteTda7540Reg(TV2REG,tv2_data); WriteTda7540Reg(42,0x48); }static void WriteTda7540Reg(u8 addr,u8 data){ i2c_write(addr,data);}static ssize_t am_fm_tuner_read(struct file * filp,char __user * buff, size_t size,loff_t * loffp){ //u8 addr = 0x0; //u8 data = 0xff; //data=i2c_read(addr); printk("\n=============tda7540 read=================\n"); return 0;}static ssize_t am_fm_tuner_write(struct file * filp,char __user * buff, size_t size,loff_t * loffp){ //unsigned char addr = 0x0; //unsigned char data = 0x0; //i2c_write(addr,data); printk("\n=============tda7540 write=================\n"); return 0;}static int am_fm_tuner_ioctl(struct inode * inode,struct file * filp, unsigned int cmd,unsigned long arg){ u32 freq=0xff; u8 i; switch(cmd) { case TDA7540_INIT : initTuner(); break; case TDA7540_SET_FREQ : get_user(freq,(u32 *)arg); setFreq(freq); //setFreq(106100); break; case TDA7540_GET_FREQ :/* freq=0; for(i=0x0;i<0x40;i++) { freq=i2c_read(i); printk("driver freq=%x\n",freq); }*/ put_user(freq,(u32 *)arg); break; } return 0;} static const struct file_operations am_fm_tuner_fops = { .owner = THIS_MODULE, .llseek = no_llseek, .read = am_fm_tuner_read, .write = am_fm_tuner_write, .ioctl = am_fm_tuner_ioctl,};static void am_fm_tuner_setup_cdev(){ int err,am_fm_tuner_devno = MKDEV(am_fm_tuner_major,0); cdev_init(&am_fm_tuner_cdev,&am_fm_tuner_fops); am_fm_tuner_cdev.owner = THIS_MODULE; am_fm_tuner_cdev.ops = &am_fm_tuner_fops; err = cdev_add(&am_fm_tuner_cdev,am_fm_tuner_devno,1);// printk("\nam_fm_tuner_setup_cdev\n"); if(err) { printk(KERN_NOTICE "Error %d adding am_fm_tuner",err); }}static int __init am_fm_tuner_init(void){ int register_result=0; dev_t am_fm_tuner_devno = MKDEV(am_fm_tuner_major,0); // printk("\nbegin=========\n"); if(am_fm_tuner_major) { register_result = register_chrdev_region(am_fm_tuner_devno,1,"tda7540"); } else {// printk("\nbefore alloc_chrdev_region\n"); register_result = alloc_chrdev_region(&am_fm_tuner_devno,0,1,"tda7540");// printk("\nafger alloc_chrdev_region result=%d\n",register_result); am_fm_tuner_major = MAJOR(am_fm_tuner_devno); } if(register_result < 0) {// printk("\nregister failure\n"); return register_result; } am_fm_tuner_setup_cdev(); return 0;}static void __exit am_fm_tuner_exit(void){ printk("\nover==========\n"); cdev_del(&am_fm_tuner_cdev); unregister_chrdev_region(MKDEV(am_fm_tuner_major,0),1); printk("\nend===========\n");}MODULE_LICENSE("Dual BSD/GPL");module_init(am_fm_tuner_init);module_exit(am_fm_tuner_exit);//=============================================================================//i2c_tda7540static int i2c_init(){ static int inited = 0; if (inited) return 0; inited = 1; * AM_FM_TUNER_PRER_LO = 0x31; * AM_FM_TUNER_PRER_HI = 0x0; * AM_FM_TUNER_CTR = 0x80; if ((* AM_FM_TUNER_PRER_LO != 0x31)||(* AM_FM_TUNER_PRER_HI != 0x0)) return -1; else return 0;}/* * function : read data by I2C from TDA7540 . * argument : addr, * argument description : the subaddress together with Pagemod(7th bit) in it */static u8 i2c_read(u8 addr){ u8 tmp; u8 result; // printk("\n=============i2c tda7540 read=================\n"); i2c_init(); * AM_FM_TUNER_TXR = (0x31<<2)|0x0; * AM_FM_TUNER_CR = 0x90; do tmp = * AM_FM_TUNER_SR; while( tmp & 0x02); //printk("temp1=%x\n",tmp); //printk("RXR1=%x\n",* AM_FM_TUNER_RXR); * AM_FM_TUNER_TXR = addr; * AM_FM_TUNER_CR = 0x10; do tmp = * AM_FM_TUNER_SR; while( tmp & 0x02); //printk("temp2=%x\n",tmp); //printk("RXR2=%x\n",* AM_FM_TUNER_RXR); * AM_FM_TUNER_TXR = (0x31<<2)|0x1; * AM_FM_TUNER_CR = 0x90; do tmp = * AM_FM_TUNER_SR; while( tmp & 0x02); //printk("temp3=%x\n",tmp); //printk("RXR3=%x\n",* AM_FM_TUNER_RXR); * AM_FM_TUNER_CR = 0x60; do tmp = * AM_FM_TUNER_SR; while( tmp & 0x02); //printk("temp4=%x\n",tmp); //printk("RXR4=%x\n",* AM_FM_TUNER_RXR); result = * AM_FM_TUNER_RXR; return result;}/* *function: write data into tda7540 register *argument: addr, data *argument description: * 1,addr; * the subaddress together with Pagemode(7th bit) in it * 2,data; * the data wiritten into tda7540 register */static int i2c_write(u8 addr,u8 data){ u8 tmp; // printk("\n==========i2c tda7540 write=================\n"); i2c_init(); * AM_FM_TUNER_TXR = (0x31<<2)|0x0; * AM_FM_TUNER_CR = 0x90; do tmp = * AM_FM_TUNER_SR; while( tmp & 0x02); * AM_FM_TUNER_TXR = addr; * AM_FM_TUNER_CR = 0x10; do tmp = * AM_FM_TUNER_SR; while( tmp & 0x02); * AM_FM_TUNER_TXR = data; * AM_FM_TUNER_CR = 0x50; do tmp = * AM_FM_TUNER_SR; while( tmp & 0x02); return 1;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -