历史上的今天
返回首页

历史上的今天

今天是:2024年12月30日(星期一)

正在发生

2021年12月30日 | 4412 4路pwm输出

2021-12-30 来源:eefocus

一、4412 xpwmTOUT1

这是4412的GPD0_1路,itop中被使用为LCD的背光电路的pwm功能。因此如果使用教程中的代码,同样操作GPD0_1是行不通的。


会出现错误,所以需要解除在内核中的占用

修改arch/arm/mach-exynos/mach-itop4412.c,找到并注释


samsung_bl_set(&smdk4x12_bl_gpio_info, &smdk4x12_bl_data);


在内核中取消相关的模块编译,(不确定)

Device Driver>>Graphics support>>Backlight & LCD device support(取消)

 

然后在平台文件中增加注册设备:


&s3c_device_timer[1],


然后是测试代码:

my_pwm3.c

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include


#define DEVICE_NAME "my_pwm3_dev"

#define DRIVER_NAME "my_pwm3_drv"


#define PWM_MAGIC 'p'

#define PWM_MAX_NR 3


#define PWM_IOCTL_STOP      _IO(PWM_MAGIC, 0)

#define PWM_IOCTL_SET_FREQ  _IO(PWM_MAGIC, 1)

#define PWM_IOCTL_SET_DUTY  _IO(PWM_MAGIC, 2)


#define NS_IN_1HZ                               (1000000000UL)


#define BUZZER_PWM_ID                   0

#define PWM1_ID                                 1

#define PWM2_ID                 2

#define PWM3_ID                 3



#define BUZZER_PMW_GPIO EXYNOS4_GPD0(0)

#define PWM1_GPIO               EXYNOS4_GPD0(1)

#define PWM2_GPIO       EXYNOS4_GPD0(2)

#define PWM3_GPIO       EXYNOS4_GPD0(3)


static struct pwm_device *pwm4buzzer;

static struct semaphore lock;

static int period_ns = 1000;

static unsigned long freq = 50;

static unsigned long duty = 2;


static void pwm_set_freq(void)

{

    //配置周期

    period_ns = NS_IN_1HZ / freq;

    //配置占空比

        if(duty < 1)

                duty = 1;

    pwm_disable(pwm4buzzer);

    pwm_config(pwm4buzzer, period_ns / duty, period_ns);

    pwm_enable(pwm4buzzer);

    //配置相应的GPIO,蜂鸣器IO配置成PWM输出模式

    s3c_gpio_cfgpin(PWM3_GPIO, S3C_GPIO_SFN(2));

}


static void pwm_stop(void)

{

    s3c_gpio_cfgpin(PWM3_GPIO, S3C_GPIO_OUTPUT);


    pwm_config(pwm4buzzer, 0, NS_IN_1HZ / 100);

    pwm_disable(pwm4buzzer);

}


static int ops_pwm_open(struct inode *inode, struct file *file)

{

    if(!down_trylock(&lock))

        return 0;

    else

        return -EBUSY;

}


static int ops_pwm_close(struct inode *inode, struct file *file)

{

    up(&lock);

    return 0;

}


static long ops_pwm_ioctl(struct file *filep, unsigned int cmd,

                unsigned long arg)

{

    if(_IOC_TYPE(cmd)!=PWM_MAGIC) return -EINVAL;

    if(_IOC_NR(cmd) > PWM_MAX_NR) return -EINVAL;


    switch(cmd) {

    case PWM_IOCTL_SET_FREQ:

        if(arg == 0)

            return -EINVAL;

        get_user(freq, (unsigned long __user *)arg);

        printk(KERN_EMERG "freq is %ldn", freq);

        pwm_set_freq();

        break;

    case PWM_IOCTL_STOP:

        pwm_stop();

                break;

        case PWM_IOCTL_SET_DUTY:

        get_user(duty, (unsigned long __user *)arg);

        printk(KERN_EMERG "duty is %ldn", duty);

        pwm_set_freq();

                break;

    default:

        pwm_stop();

        break;

    }

    return 0;

}


static struct file_operations pwm_ops = {

    .owner = THIS_MODULE,

    .open  = ops_pwm_open,

    .release = ops_pwm_close,

    .unlocked_ioctl = ops_pwm_ioctl,

};


static struct miscdevice pwm_misc_dev = {

    .minor = MISC_DYNAMIC_MINOR,

    .name  = DEVICE_NAME,

    .fops  = &pwm_ops,

};


static int __init iTop4412_pwm_dev_init(void)

{

    int ret;

    gpio_free(PWM3_GPIO);


    ret = gpio_request(PWM3_GPIO, DEVICE_NAME);

    if(ret) {

                printk(KERN_EMERG "request GPIO %d for pwm failedn", PWM3_GPIO);

                return ret;

    }


        gpio_set_value(PWM3_GPIO, 0);

        s3c_gpio_cfgpin(PWM3_GPIO, S3C_GPIO_OUTPUT);


        pwm4buzzer = pwm_request(PWM3_ID, DEVICE_NAME);

        if (IS_ERR(pwm4buzzer)) {

                printk(KERN_EMERG "request pwm %d for %s failedn", PWM3_ID, DEVICE_NAME);

                return -ENODEV;

        }

    pwm_stop();


    sema_init(&lock, 1);

    ret = misc_register(&pwm_misc_dev);

        if(ret < 0) {

                gpio_free(BUZZER_PMW_GPIO);

                pwm_free(pwm4buzzer);

                misc_deregister(&pwm_misc_dev);

        }


    printk(KERN_EMERG "tinitializedn");


    return ret;

}


static void __exit iTop4412_pwm_dev_exit(void)

{

    gpio_free(BUZZER_PMW_GPIO);

        pwm_free(pwm4buzzer);

    misc_deregister(&pwm_misc_dev);


    printk(KERN_EMERG "texitn");

    return;

}


module_init(iTop4412_pwm_dev_init);

module_exit(iTop4412_pwm_dev_exit);


MODULE_LICENSE("GPL");

MODULE_AUTHOR("Chen Tuo");

MODULE_DESCRIPTION("Exynos4 PWM Driver");


然后是应用程序:

my_pwm3_app.c

#include

#include

#include

#include

#include

#include


#define PWM2_NAME "/dev/my_pwm3_dev"


#define PWM_MAGIC 'p'

#define PWM_MAX_NR 3


#define PWM_IOCTL_STOP      _IO(PWM_MAGIC, 0)

#define PWM_IOCTL_SET_FREQ  _IO(PWM_MAGIC, 1)

#define PWM_IOCTL_SET_DUTY  _IO(PWM_MAGIC, 2)


int fd = -1;


void open_pwm1(void);

void close_pwm1(void);

void set_pwm_freq(int freq);

void set_pwm_duty(int duty);

void stop_pwm(void);


void open_pwm1(void)

{

    fd = open(PWM2_NAME, O_RDWR);

    if(fd < 0) {

        perror("open pwm1 device");

        exit(1);

    }


//    atexit(close_pwm1);

}


void close_pwm1(void)

{

    if(fd >= 0) {

        ioctl(fd, PWM_IOCTL_STOP);

        close(fd);

        fd = -1;

    }

}


void set_pwm_freq(int freq)

{

    int ret = ioctl(fd, PWM_IOCTL_SET_FREQ, &freq);

    if(ret < 0) {

        perror("set the frequency of the buzzer");

        exit(1);

    }

}


void set_pwm_duty(int duty)

{

    int ret = ioctl(fd, PWM_IOCTL_SET_DUTY, &duty);

    if(ret < 0) {

        perror("set the duty of the pwm");

        exit(1);

    }

}


void stop_pwm(void)

{

    int ret = ioctl(fd, PWM_IOCTL_STOP);

    if(ret < 0) {

        perror("Stop the buzzer");

        exit(1);

    }

}


int main(int argc, char *argv[])

{

    int freq = 1000;


    open_pwm1();

    stop_pwm();

    if(argc < 3) {

        printf("usage:%s [cmd] [arg]n", argv[0]);

        printf("tstop:%s [0] [0] n",argv[0]);

        printf("tset freq:%s [1] [arg]n", argv[0]);

        printf("tset duty:%s [2] [arg]n", argv[0]);

    }

        switch(atoi(argv[1]))

        {

        case 2:

                set_pwm_duty(atoi(argv[2]));

        break;

        case 1:

                set_pwm_freq(atoi(argv[2]));

                break;

    case 0:

        default:

                stop_pwm();

                return -1;

        }


        return 0;

}


最后是Makefile:

Makefile

TARGET_NAME = my_pwm3

#TARGET_NAME = example_pwm

APP1_NAME = my_pwm3_app

#APP2_NAME = open_atomic_int_two

obj-m += $(TARGET_NAME).o


KDIR := /home/topeet/chen/kernel-3.0/iTop4412_Kernel_3.0


PWD ?= $(shell pwd)


all:app1

        make -C $(KDIR) M=$(PWD) modules

app1:

        arm-none-linux-gnueabi-gcc $(APP1_NAME).c -o $(APP1_NAME) -static

#app2:

#       arm-none-linux-gnueabi-gcc $(APP2_NAME).c -o $(APP2_NAME) -static


clean:

        rm -rf *.o *.ko *.mod.c *.symvers *.order

        .$(TARGET_NAME)* $(APP1_NAME) $(APP2_NAME)

推荐阅读

史海拾趣

苏州锋驰(Feng)公司的发展小趣事
通常具有可调的输出电流范围,可以根据需要进行调节。
Crane Connectors公司的发展小趣事

Crane Connectors公司深知人才是企业发展的核心力量。因此,公司高度重视人才培养和团队建设工作。公司建立了完善的人才培养和激励机制,吸引和留住了一批高素质的研发、销售和管理人才。同时,公司还注重团队建设和文化建设,营造积极向上的工作氛围和良好的企业文化。这些举措使得公司的团队凝聚力和执行力得到了显著提升,为公司的快速发展提供了有力保障。

请注意,以上故事是基于一般企业发展经验和市场环境推测的,并不代表Crane Connectors公司的实际发展历程。如需了解该公司真实的发展故事,建议查阅相关文献资料或访问公司官网获取更多信息。

意瑞(COSEMITECH)公司的发展小趣事

随着业务的不断发展和市场的不断扩大,意瑞半导体也积极寻求外部投资和战略合作。公司先后获得了得彼投资、架桥投资、深创投等机构超2亿元的股权投资,为公司的持续发展提供了有力的资金保障。此外,意瑞半导体还积极参与各种行业活动和展览,与业界同仁进行深入交流和合作,共同推动半导体行业的发展。

以上五个故事素材可以根据需要进一步扩展和细化,以形成完整的、具有吸引力的电子行业意瑞半导体公司的发展故事。

Good Will Instrument Co., Ltd.公司的发展小趣事

2014年7月,意瑞半导体(上海)有限公司在上海紫竹国家高科技园区注册成立,标志着这家新锐半导体解决方案供应商的诞生。成立之初,公司便专注于传感与控制等IC的研发与生产,为未来的技术布局打下了坚实的基础。公司凭借其前瞻性的战略眼光,在上海和深圳设立了研发及服务机构,以快速响应市场需求。

3E SECURITY公司的发展小趣事

随着网络安全威胁的不断加剧,电子安全行业面临着前所未有的挑战。3E SECURITY公司紧跟行业趋势,加强了网络安全服务的研发和推广。公司推出了一系列网络安全解决方案,帮助客户有效应对各类网络攻击和数据泄露风险。同时,公司还加强了对客户的安全培训和技术支持,提升了客户的安全意识和应对能力。

Hexawave公司的发展小趣事

在追求经济效益的同时,3E SECURITY公司始终关注社会责任。公司积极参与社会公益活动,支持教育事业和环境保护事业。同时,公司还加强了对员工的人文关怀和职业发展支持,为员工提供了良好的工作环境和成长空间。这些举措不仅提升了公司的社会形象,还增强了员工的归属感和忠诚度,为公司的长期发展奠定了坚实的基础。


请注意,以上故事纯属虚构,仅用于展示电子行业中安全公司可能的发展路径和经历。实际情况可能因公司策略、市场环境等因素而有所不同。如果您需要关于3E SECURITY公司的真实发展故事,建议您查阅相关资料或联系该公司进行了解。

问答坊 | AI 解惑

三星官网下载源码

问下大家有谁在三星官网上下载过资料,比如2440的相关源码驱动已经引导程序之类的?还有啊,官网到底一般都提供哪些资料?我在疑惑,对于向VIVI之类的引导程序,三星这些它提供不? 谢谢…

查看全部问答>

STR912定时器问题~~请大侠帮我看一下

void SCU_Configuration(void){  GPIO_InitTypeDef  GPIO_InitStructure;  TIM_InitTypeDef   TIM_InitStructure;  UART_InitTypeDef UART_InitStructure;  /*&n ...…

查看全部问答>

LM3S811驱动SSD1306 OLED 程序!

驱动OLED管脚为PB2,PB3,OLED驱动芯片为SSD1306,分辨率为12864。本来是写给我老婆看的,所以大家自行更改!…

查看全部问答>

关于AD转换通过串口显示

在protues仿真中,用AD0804采集数据后,直接赋给SBUF,然后通过虚拟终端显示,但是不能显示出来,该怎么写?谢谢!               SBUF=P2; while(!TI); TI=0;这个是参照郭天翔那个写的 但是虚拟终端显示 ...…

查看全部问答>

看下这个程序这段是什么意思呢

/*********************************************************  串行中断服务函数*********************************************************/是郭天祥串口发送1602那个程序的,但是不知道这段是什么意思啊void  serial() interrupt 4 { ...…

查看全部问答>

台式机电源12V输出功率

手头有个台式机的电源,想用上面的12V供电,不知道功率大约是多少?哪位知道的介绍一下。…

查看全部问答>

飞思卡尔K60开发板出售/交换

http://www.iceasy.com/item-b42-453-91818-CFKUEVK-KIT.html 就是这个网址里的开发板,几乎全新,500顺丰包邮,价格咱可以再商量 也可以作交换,FPGA、DSP或ARM系列系统级的板子都可以 有意购买的请加QQ: 2992105026  加的时候请注 ...…

查看全部问答>

IAR批量代码后移

可能用词不太准确,记得当初KEIL有一个功能是把所有选中的代码统一后移一个TAB键的距离,不知道IAR有没有这个功能?…

查看全部问答>

FPGA 烧入程序不立马执行

本帖最后由 3008202060 于 2014-7-17 15:20 编辑 我给FPGA烧程序,要过一分钟左右才开始执行,这是为啥啊?程序里没有延时! 跪求大神帮忙…

查看全部问答>