标签:
这一章的主要内容是让开发板发出声音——蜂鸣器驱动,在Linux驱动开发中重点也学习了这一部分内容,同时最后我们小组的考核内容是通过中断控制蜂鸣器发七个音符的音。
这一部分中,要中断控制蜂鸣器,在中断和蜂鸣器代码的基础上进行增加。中断与蜂鸣器的代码不变,在中断的测试代码中,首先要定义七个音符,之后将开发板上的七个键与七个音符相连接,再将七个音符的转换与蜂鸣器相连接,来达到所需的效果。
核心代码:
int main()
{
int fd,fd1;
int div;
int keyval;
fd1 = open("/dev/pwm",O_RDWR | O_NONBLOCK);
if ((fd = open("/dev/key", O_RDONLY)) < 0)
{
perror("fail to open");
exit(-1);
}
while ( 1 )
{
if (read(fd, &keyval, sizeof(int)) < 0)
{
perror("fail to read");
}
printf("key %d is pressed\n", keyval);
ioctl(fd1,BEEP_ON);
switch(keyval){
case 1 :
div = (PCLK/256/16)/Do;
ioctl(fd1,SET_CNT,div);
break;
case 2 :
div = (PCLK/256/16)/Re;
ioctl(fd1,SET_CNT,div);
break;
case 3:
div = (PCLK/256/16)/Mi;
ioctl(fd1,SET_CNT,div);
break;
case 4 :
div = (PCLK/256/16)/Fa;
ioctl(fd1,SET_CNT,div);
break;
case 5 :
div = (PCLK/256/16)/Sol;
ioctl(fd1,SET_CNT,div);
break;
case 6 :
div = (PCLK/256/16)/La;
ioctl(fd1,SET_CNT,div);
break;
case 7 :
div = (PCLK/256/16)/Si;
ioctl(fd1,SET_CNT,div);
break;
}
}
return 0;
}
static long fs210_pwm_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
{
//printk("pwm: device ioctl\n");
switch(cmd)
{
case BEEP_ON:
printk("pwm: BEEP ON\n");
beep_on();
break;
case BEEP_OFF:
printk("pwm: BEEP OFF\n");
beep_off();
break;
case SET_CNT:
printk("pwm: SET CNT\n");
set_cnt(arg);
break;
default:
printk("pwm: available command\n");
return -EINVAL;
}
return 0;
}
当然这其中包含很多要学习的内容,例如初始化函数式init,退出函数是exit,在需要管道时要定义fd,还要学会将频率改变传给蜂鸣器进而使其发不同的音。
标签:
原文地址:http://www.cnblogs.com/JCoco/p/5654759.html